小编典典

流利的NHibernate不会在WHERE子句中创建IN部分

sql

我有Fluent NHibernate Linq查询,其中我根据运行时数组检查值。一个基本的例子是:

var array = [1,2,3,4,5,6];
using (var session = SessionProvider.SessionFactory.OpenSession())
{
  return session.Query<MyObject>().Where(x => array.Contains(x.CompareVal)).ToList();
}

我希望生成的SQL语句看起来像这样:

SELECT CompareVal, Column1, Column2
FROM MyObject
WHERE CompareVal IN (1,2,3,4,5,6)

但是,我发现的是,生成的SQL语句只是发出WHERE子句(通过在Profiler中进行观察来证明)并选择整个表,然后在将所有数据取回后似乎在内存中运行了过滤器。

值得注意的是-我有一个通用存储库类,所有这些调用都通过该类进行了传递。Query方法如下:

public IList<T> Query(Func<T, bool> criteria)
{
  using (var session = SessionProvider.SessionFactory.OpenSession())
  {
    return session.Query<T>().Where(criteria).ToList();
  }
}

显然,在具有大量数据的表中,这(缺少where子句)是不可接受的。如何强制NHibernate使用WHERE子句正确生成查询并仍然为存储库保留通用模式?


阅读 133

收藏
2021-03-23

共1个答案

小编典典

使用任何:

 return session.Query<MyObject>().Where(x => array.Any(y => y == x.CompareVal)).ToList();

您的存储库模式(使用简单的Func)会自动将查询具体化为要列出的内容,如果您希望推迟执行某些操作,请使用IQueryable,不要仅使用Func

值得注意的是-我有一个通用存储库类,所有这些调用都通过该类进行了传递。Query方法如下:

public IList<T> Query(Func<T, bool> criteria)
{
  using (var session = SessionProvider.SessionFactory.OpenSession())
  {
    return session.Query<T>().Where(criteria).ToList();
  }
}

您的存储库只是模仿NHibernate开箱即用的内容

2021-03-23