任何人都可以告诉我为什么这两个代码片段给我两个不同的SQL执行:
return nHibernateSession.Query<TEntity>()
.Where(_filter)
.Select(_selector)
.FirstOrDefault();
我传递参数的地方
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();
这个行为就像我期望前一个行为一样。它只选择名称列,并应用WHERE子句以确保我只获得产品10.
答案 0 :(得分:1)
NHibernate需要过滤器的表达式树才能从中生成SQL。当您将Func
传递给它时,NHibernate无法将其转换为SQL,因此它会从数据库中检索所有数据,然后将Func
过滤器应用于它。
将第一个更改为
Expression<Func<Product, bool>> _filter = x => x.Id == 10;
Expression<Func<Product, string>> _selector = x => x.Name;
在这种情况下,您将整个表达式赋予NHibernate,因此可以基于它生成受限查询。