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进一步转换为实际数据库查询的"内部"(依赖于方法)查询吗?

What is the difference between NHibernate Query<> vs Q

在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_

希望这将有助于