NHibernate Query<>之间的区别是什么? vs QueryOver<&gt ;?

时间:2013-02-22 09:29:30

标签: c# nhibernate

我刚开始使用NHibernate(使用SQLite)在我当前的项目中,我主要使用Query<>,因为我很熟悉在Linq中编写数据库查询。

当我遇到一些更复杂的查询时,我对QueryOver<>进行了一些研究,并认为它应该优于Query<>,因为“QueryOver语法是NH特定的”。此外,似乎Query<>无法完成QueryOver<>无法完成的任何操作。

所以我开始相应地更换Query<>的所有用法。不久之后,我遇到第一个“问题”,使用Query<>似乎更方便。 示例(从表CustomNumber中的列BillingDataEntity中选择最高值):

int result = Session.Query<BillingDataEntity>().Select(x => x.CustomNumber).OrderByDescending(a => a).FirstOrDefault();
int result = Session.QueryOver<BillingDataEntity>().Select(x => x.CustomNumber).OrderBy(a => a.CustomNumber).Desc.Take(1).SingleOrDefault<int>();

我不喜欢需要将结果显式地转换为int并且查询&lt;&gt;版本更容易阅读。我的查询完全错了,换句话说:有没有更好的方法呢?

我看了一下生成的SQL输出:

NHibernate: select billingdat0_.CustomNumber as col_0_0_ from "BillingDataEntity" billingdat0_ order by billingdat0_.CustomNumber desc limit 1
NHibernate: SELECT this_.CustomNumber as y0_ FROM "BillingDataEntity" this_ ORDER BY this_.CustomNumber desc limit @p0;@p0 = 1 [Type: Int32 (0)]

我究竟在看什么?这是NHibernate进一步转换为实际数据库查询的“内部”(依赖于方法)查询吗?

2 个答案:

答案 0 :(得分:33)

在Stackoverflow上有很多关于QueryOver与Query的答案,但简而言之: -

  

QueryOver是Criteria的强类型版本,而且更多   NHibernate具体。你可以在ICriteria做任何事情   使用QueryOver完成。在ICriteria NH2的黄金时代,你总是有   投射,因此这就是为什么现在你需要在结束时施放   链回到int。

     

LINQ(Query)是一种标准的查询方法,适用于IQueryable   不需要显式引用NHibernate,可以考虑   更多ORM不可知,因此遵循linq标准。就像你一样   正确地指出你不需要像你一样强制转换为int   选择结果customNumber。

如果生成的SQL非常不同,我会对你的简单例子感到非常惊讶。

我是QueryOver的忠实粉丝,但随着Linq提供商越来越成熟,我使用Query 95%的查询但是对于某些Nhibernate特定的东西我退回到{{1 }}。无论哪种方式,我建议使用分析工具来查看您可以使用的内容。

参考:Tradeoffsversusversus

答案 1 :(得分:2)

关于您的QueryOver版本,我会写:

int result = Session.QueryOver<BillingDataEntity>()
               .Select(Projections.Max<BillingDataEntity>(x => x.CustomNumber))
               .SingleOrDefault<int>();

它看起来很可读,结果SQL就像:

SELECT max(this_.CustomNumber) as y0_ FROM "BillingDataEntity" this_

希望这会有所帮助