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

Jef*_*eff 2 c# linq nhibernate

我正在尝试为我的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();

    }
Run Code Online (Sandbox Code Playgroud)

当我传入一个谓词,并观察NH生成的SQL语句时,我看不到where子句.

NHibernate何时执行查询?什么时候打电话.Query<T>()?如果是这样,我怎么能做到这一点?

Jeh*_*hof 5

查询应该由调用执行ToList().

WHERE子句未包含在sql语句中的情况是您需要将a传递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();

    }
Run Code Online (Sandbox Code Playgroud)

扩展方法Where(Func<T,bool>>)Enumerable上定义,以便查询加载所有数据,然后在内存中应用WHERE过滤器.

扩展方法Where(Expression<Func<T,bool>>)Queryable上定义,以便查询提供程序(NHibernate)可以构建一个sql语句,包括在数据源上执行的WHERE条件.