【发布时间】:2013-01-16 20:18:45
【问题描述】:
我有 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 中观察证明)并选择整个表,然后似乎在获取所有数据后在内存中运行过滤器返回。
需要注意的一点 - 我有一个通用存储库类,所有这些调用都通过它汇集。查询方法如下:
public IList<T> Query(Func<T, bool> criteria)
{
using (var session = SessionProvider.SessionFactory.OpenSession())
{
return session.Query<T>().Where(criteria).ToList();
}
}
显然,这(缺少 where 子句)在具有大量数据的表中是不可接受的。我可以做些什么来强制 NHibernate 使用 WHERE 子句正确生成查询并仍然为存储库保留通用模式?
【问题讨论】:
-
Fluent NH 与 linq 提供程序无关。你必须使用linq吗? NH 有更多功能,
QueryOver。 -
@dotjoe 是的,Linq 对于这个系统的架构来说是必不可少的(或者我们会使用存储过程)。此调用也是作为通用存储库调用的一部分进行的。 QueryOver 不能使用,因为我传递的是 T 而不是引用类型。
-
可能是数组类型与 CompareVal 类型匹配的问题。你能给出 array 的确切声明吗?您提供的那个似乎没有通过语法检查。
-
我有 2 种类型的数组 - 两者都是简单类型。整数和字符串
标签: c# sql nhibernate fluent