NHibernate Linq泛型无界结果集
本文关键字:结果 Linq 泛型 NHibernate | 更新日期: 2023-09-27 18:07:56
谁能告诉我为什么这两个代码片段给了我两个不同的SQL执行:
<标题>第一h1> 入参数Func<Product, bool> _filter = x => x.Id == 10;
Func<Product, string> _selector = x => x.Name;
当使用NHibernate Profiler检查查询时,这表明我在一个无界查询中完全包含了整个产品集合。它选择所有字段和所有行,然后我猜它过滤结果集,只返回名称。
<标题> 第二和一个我明确指定了我的查询。我试着调试前面的通用表达式。
return nHibernateSession.Query<Product>()
.Where(x => x.Id == 10)
.Select(x => x.Name)
.FirstOrDefault();
这个的行为和我期望的前一个的行为一样。它只选择name列,并应用WHERE子句,以确保只获得product 10。
标题>标题>NHibernate需要过滤器的表达式树来从中生成SQL。当你传递一个Func
给它时,NHibernate不能把它转换成SQL,所以它从DB中检索所有的数据,然后应用Func
过滤器。将第一个改为
Expression<Func<Product, bool>> _filter = x => x.Id == 10;
Expression<Func<Product, string>> _selector = x => x.Name;
在这种情况下,你把整个表达式给NHibernate,因此可以基于它生成一个受限查询