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子句正确生成查询并仍保留存储库的通用模式?
使用任意:
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 已经提供的开箱即用的内容
| 归档时间: |
|
| 查看次数: |
1968 次 |
| 最近记录: |