当前位置: 首页 > 面试题库 >

流利的NHibernate不会在WHERE子句中创建IN部分

郎聪
2023-03-14
问题内容

我有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中进行观察来证明)并选择整个表,然后在将所有数据取回后似乎在内存中运行了过滤器。

值得注意的是-我有一个通用存储库类,所有这些调用都通过该类进行了传递。Query方法如下:

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

显然,在具有大量数据的表中,这(缺少where子句)是不可接受的。如何强制NHibernate使用WHERE子句正确生成查询并仍然为存储库保留通用模式?


问题答案:

使用任何:

 return session.Query<MyObject>().Where(x => array.Any(y => y == x.CompareVal)).ToList();

您的存储库模式(使用简单的Func)会自动将查询具体化为要列出的内容,如果您希望推迟执行某些操作,请使用IQueryable,不要仅使用Func

值得注意的是-我有一个通用存储库类,所有这些调用都通过该类进行了传递。Query方法如下:

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

您的存储库只是模仿NHibernate开箱即用的内容



 类似资料:
  • 本文向大家介绍nhibernate 流利的NHibernate映射,包括了nhibernate 流利的NHibernate映射的使用技巧和注意事项,需要的朋友参考一下 示例 该Fluent NHibernate是一个库,以帮助您在使用C#代码,而不是XML映射的实体映射。Fluent NHibernate使用,fluent pattern并且它基于约定来创建映射,它为Visual Studio工具

  • 问题内容: 在处理大型数据库时,哪个性能更好,还是在SQL子句中? 它们的执行方式有什么不同吗? 问题答案: 我假设您想知道以下两者之间的性能差异: 根据MySQL手册,如果值是常数,则对列表进行排序,然后使用二进制搜索。我可以想象一下,它们以不特定的顺序进行逐一评估。因此在某些情况下速度更快。 最好的了解方法是使用特定数据在数据库中同时对它们进行概要分析,以查看哪种方法更快。 我在具有10000

  • 我是QueryDSL的新手,能够在WHERE-in子句中组装具有多个列的查询,如下所示: 我有主要查询的部分: 但我不知道如何实现where子句。如何在QueryDSL中实现这一点? 提前致谢!

  • 例如,我想做这样的事情: 新建Select().from(Table).where(“id in?”,list).execute()

  • 我以前有一个类似于Rails的查询: 它生成sql查询,如下所示: 现在我想将其更改为使用而不是。我创建了这个: 现在,当我使用空数组时,我得到以下错误:

  • 问题内容: Spring数据中是否有一种方法可以动态形成where子句? 我想做的是有一个方法(类似于findBy / get方法),该方法运行WHERE和AND并使用所提及的NOT NULL属性。 例如, 我们的方法看起来像这样 谢谢。 问题答案: 看看Spring数据存储库都支持的JPA规范和谓词,甚至更好的QueryDSL。本文提供了一个示例:http : //spring.io/blog/