我正在尝试为我的NHibernate数据访问编写一个通用存储库。 Get<T>()
方法应该能够采用可选的谓词,该谓词应包含在查询中-也就是说,NHibernate应该在SQL中生成WHERE子句。
public virtual IList<T> Get(Func<T, bool> predicate = null)
{
// Open NHibernate Session
using (var session = NHibernateHelper.OpenSession())
return (predicate != null
? session.Query<T>().Where(predicate)
: session.Query<T>()).ToList();
}
当我传入一个谓词并观察NH生成的SQL语句时,我看不到where子句。
NHibernate何时执行查询?调用.Query<T>()
时正确吗?如果是这样,我该如何实现?
参考方案
该查询应通过调用ToList()
执行。
为什么WHERE子句不包含在您的sql语句中,是因为您需要将Expression<Func<T,bool>>
传递给您的方法。
public virtual IList<T> Get(Expression<Func<T, bool>> predicate = null)
{
// Open NHibernate Session
using (var session = NHibernateHelper.OpenSession())
return (predicate != null
? session.Query<T>().Where(predicate)
: session.Query<T>()).ToList();
}
扩展方法Where(Func<T,bool>>)
在Enumerable上定义,以便查询加载所有数据,然后在内存中应用WHERE筛选器。
扩展方法Where(Expression<Func<T,bool>>)
是在Queryable上定义的,以便查询提供程序(NHibernate)可以构建一个sql语句,其中包括在数据源上执行的WHERE条件。
我有一个包含成员Predicate的类,希望在Linq表达式中使用该类:using System.Linq; class MyClass { public bool DoAllHaveSomeProperty() { return m_instrumentList.All(m_filterExpression); } private IEnumerable&…
如何在Collection <T>上使用ToList - c#MSDN documentation表示类Collection<T>在扩展部分中具有方法ToList()。如何使用这种方法? 参考方案 该文档有点误导。类型Collection<T>没有直接使用此方法。相反,它被定义为System.Linq.Enumerable上的扩展方法。为using添加System.Linq指令应该可以解决此问题…
Junit4和TestNG与Maven在一个项目中 - java要一起运行它们,几乎没有可用的选项,但是我选择为Junit和TestNG使用不同的配置文件。但是现在的问题是排除和包含测试用例。由于如果我们在Maven的主项目中添加testNG依赖项,它将跳过所有Junit,因此我决定将其放在单独的配置文件中。所以我使用pom.xml中的以下条目从默认(主要)配置文件中排除了TestNG测试:<plugin> …
Java中的<<或>>>是什么意思? - javaThis question already has answers here: Closed 7 years ago. Possible Duplicate: What does >> and >>> mean in Java?我在一些Java代码中遇到了一些陌生的符号,尽管代码可以正确编译和运行,但对于括号在此代码中的作用却感…
通过Maven编译器插件不会发生有限的包含和排除 - java我正在使用3.6.0版的maven编译器插件,在此我们只想在特定文件夹中编译一个文件,而在该位置编译所有其他文件。例如:在文件夹应用程序中有14个文件,从那我只希望编译1个文件,但它编译了所有文件,如果我要排除,则它也不起作用。 <sourceDirectory>${basedir}/../src/java</sourceDirectory…