What is the difference between NHibernate Query<> vs Q
本文关键字:lt vs gt Query the is difference between NHibernate What | 更新日期: 2023-09-27 18:00:27
我在当前项目中刚开始使用NHibernate(使用SQLite),我主要使用Query<>
,因为我熟悉在Linq中编写数据库查询。
当我遇到一些更复杂的查询时,我对QueryOver<>
进行了一些研究,并认为它应该比Query<>
更受欢迎,因为"QueryOver语法是NH特定的"。此外,似乎没有什么是Query<>
能做到的,而QueryOver<>
不能做到的。
因此,我开始相应地替换Query<>
的所有用法。没过多久,我就遇到了使用Query<>
似乎更方便的第一个"问题"。示例(从表BillingDataEntity
中的列CustomNumber
中选择最高值):
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,并且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进一步转换为实际数据库查询的"内部"(依赖于方法)查询吗?
在Stackoverflow上有很多关于QueryOver与Query的答案,但简而言之:-
QueryOver是Criteria的强类型版本NHibernate特异性。你在ICriteria几乎可以做任何事情使用QueryOver完成。在ICriteria NH2的黄金岁月里,你总是因此,这就是为什么现在需要在链回到内部
LINQ(Query)是一种标准查询方法,适用于IQueryable不需要明确引用NHibernate,可以考虑更不可知ORM,因此遵循linq标准。作为你正确地指出,你不需要像现在这样强制转换为int在结果中选择customNumber。
如果生成的SQL非常不同,那么对于您的简单示例,我会感到非常惊讶。
我是QueryOver
的忠实粉丝,但随着Linq提供程序越来越成熟,我95%的查询都使用Query
,但对于一些特定于Nhibernate的东西,我又回到了QueryOver
。无论哪种方式,我都建议使用评测工具来查看您可以使用什么。
参考:权衡或与的对比
关于你的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_
希望这将有助于