我有流畅的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子句正确生成查询并仍保留存储库的通用模式?