Fluent NHibernate不会创建IN WHERE子句的一部分

Bla*_*Spy 6 c# sql nhibernate 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();
}
Run Code Online (Sandbox Code Playgroud)

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

SELECT CompareVal, Column1, Column2
FROM MyObject
WHERE CompareVal IN (1,2,3,4,5,6)
Run Code Online (Sandbox Code Playgroud)

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

需要注意的事项 - 我有一个Generic Repository类,所有这些调用都是通过漏洞进行的.Query方法如下:

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

显然,在具有大量数据的表中,这种情况(缺少where子句)是不可接受的.我该怎么做才能强制NHibernate使用WHERE子句正确生成查询并仍保留存储库的通用模式?

Mic*_*uen 2

使用任意:

 return session.Query<MyObject>().Where(x => array.Any(y => y == x.CompareVal)).ToList();
Run Code Online (Sandbox Code Playgroud)

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

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

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

你的存储库只是模仿 NHibernate 已经提供的开箱即用的内容