使用NHibernate QueryOver进行后期评估

使用NHibernate QueryOver进行后期评估,nhibernate,queryover,Nhibernate,Queryover,Linq返回IQueryable给我晚评估。QueryOver也可以这样做吗 更新: 我将使用它来定义许多只使用子集的查询。因此,未来不是解决方案,它将执行所有这些 我喜欢NHibernate.Linq中的IQueryable(IEnumerable)返回类型,如果从未使用它,它将永远不会执行查询。首先,即使QueryOver只是一组定义,稍后将转换为SQL语句。因此,直到您使用对 IQueryOver<Entity, Entity> ab = session.QueryOver&l

Linq返回IQueryable给我晚评估。QueryOver也可以这样做吗

更新:

我将使用它来定义许多只使用子集的查询。因此,未来不是解决方案,它将执行所有这些


我喜欢NHibernate.Linq中的IQueryable(IEnumerable)返回类型,如果从未使用它,它将永远不会执行查询。

首先,即使
QueryOver
只是一组定义,稍后将转换为SQL语句。因此,直到您使用对

IQueryOver<Entity, Entity> ab = session.QueryOver<Entity>();
IQueryOver ab=session.QueryOver();
并且不调用
List()
。。。执行被推迟。这也是使用分离查询的方法

QueryOver query=QueryOver.Of()
其中(c=>c.Name==“Paddy”);
另一个强大的功能是
Future
。这是一种非常简单的方法,可以在堆栈上放置少量查询,并且仅当需要第一个查询时。。。所有这些都被执行并作为批处理传递给DB服务器。请在此阅读更多:

它们本质上是一种将查询执行推迟到以后执行的方式 日期,届时NHibernate将获得更多关于 应用程序应该这样做,并相应地进行优化

最大的区别是,当使用
QueryOver

编辑:扩展问题更新


IQueryable
只能从
session.Query()
返回,而在使用QueryOver、ICriteria、HQL。。。使用
QueryOver

时无法达到相同的行为。感谢您的回复。请参阅问题中的其他信息。简短回答:我不想从我的存储库返回IQueryOver。IEnumerable就好了。IEnumerable需要调用
List()
(只是返回更通用的接口)。不过,在这种情况下,当调用
List()
时,查询会立即执行,我知道,这就是问题所在。我只是认为这将是QueryOver解决的问题。我想我只需要创建一个包装器类,它为我提供了后期评估+IEnumerablet
IQueryable
的功能在于将其发布给外部消费者(主要通过OData)。如果是这种情况,请使用Linq(session.Query())。要引入一些包装器,请考虑发布
IEnumerable Find(EntityFilter)
。然后,您可以从上层收集过滤器对象,并应用数据层中的所有过滤器。。。仅选择用户需要的内容,包括分页
QueryOver<Cat> query = QueryOver.Of<Cat>()
        .Where(c => c.Name == "Paddy");