gpt4 book ai didi

c# - Fluent NHibernate 不创建 WHERE 子句的 IN 部分

转载 作者:太空狗 更新时间:2023-10-29 21:40:15 26 4
gpt4 key购买 nike

我有 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 子句)在具有大量数据的表中是 Not Acceptable 。我该怎么做才能强制 NHibernate 使用 WHERE 子句正确生成查询并仍然保持存储库的通用模式?

最佳答案

如果您将 Query 方法更改为以下内容,会有什么不同吗?

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

这就是我通常处理通用查询的方式:

    public List<TOut> GetEntitiesLinq<TIn,TOut>(Expression<Func<IQueryable<TIn>,IQueryable<TOut>>> myFunc)
{
var t = (myFunc.Compile())(_session.Query<TIn>()) ;
return t.ToList();
}

那么我将如何在你的情况下使用它:

var myObjList = myQueryManager.GetEntitiesLinq<MyObject,MyObject>(x=>x.Where(myObj => array.Contains(myObj.CompareVal)));

希望对你有帮助

关于c# - Fluent NHibernate 不创建 WHERE 子句的 IN 部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14647670/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com