我有 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 中观察证明)并选择整个表,然后似乎在获取所有数据后在内存中运行过滤器。
需要注意的一点 - 我有一个 Generic Repository 类,所有这些调用都通过它汇集。查询方法如下:
public IList<T> Query(Func<T, bool> criteria)
{
using (var session = SessionProvider.SessionFactory.OpenSession())
{
return session.Query<T>().Where(criteria).ToList();
}
}
显然,这(缺少 where 子句)在具有大量数据的表中是不可接受的。我可以做些什么来强制 NHibernate 使用 WHERE 子句正确生成查询并仍然为存储库保留通用模式?