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 Linq泛型无界结果集

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,因此可以基于它生成一个受限查询