NHibernate Linq Generics无界结果集

时间:2015-08-14 19:47:10

标签: c# sql linq nhibernate

任何人都可以告诉我为什么这两个代码片段给我两个不同的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.

1 个答案:

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