NHibernate Query<> 和 QueryOver<> 之间有什么区别?

22 浏览
0 Comments

NHibernate Query<> 和 QueryOver<> 之间有什么区别?

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

当我面对一些更复杂的查询时,我研究了一下QueryOver<>,发现它应该优先于Query<>,因为"QueryOver语法是NH特定的"。而且,似乎Query<>可以做的事情QueryOver<>都可以完成。

所以我开始相应地替换所有使用Query<>的地方。但没过多久,就出现了第一个“问题”,使用Query<>似乎更方便。

例如(从表BillingDataEntity的列CustomNumber中选择最高的值):

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

我不喜欢的是需要显式将结果转换为int,而且Query<>版本更容易阅读。我是不是完全弄错了查询的方式,换句话说:有更好的方法吗?

我看了一下生成的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进一步转换为实际数据库查询的“内部”(方法依赖)查询吗?

0