NHibernate什么时候执行我的查询? - c#

我正在尝试为我的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条件。

将谓词<T>转换为Func <T,bool> - c#

我有一个包含成员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中的<<或>>>是什么意思? - java

This 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…