在 NHibernate 查询中实现条件的更好方法是啥?

Posted

技术标签:

【中文标题】在 NHibernate 查询中实现条件的更好方法是啥?【英文标题】:What's the better way to implement a condition at NHibernate query?在 NHibernate 查询中实现条件的更好方法是什么? 【发布时间】:2019-03-27 13:22:44 【问题描述】:

我正在使用 NHibernate 的 Query 的泛型实现。 我的方法:

public IEnumerable<TEntidade> ObterEntidadesPor(Func<TEntidade, bool> where)
        
            return SessionNH.Query<TEntidade>().Where(where);
        

在这种情况下,NHibernate 首先执行 "select * from TEntidade" 将所有信息带到内存中,然后执行 "where" 条件。这需要很多时间。

有没有更好的方法?

【问题讨论】:

为什么不使用实体框架,(不确定NHibernate)但是EF 将where 转换为SQL 中的WHERE 子句,并且不会提取内存中的所有记录来进行过滤。 这里的所有应用程序都使用 NHibernate。如果没有大的影响,我无法更改为 EF。 改用Expression&lt;Func&lt;TEntidade, bool&gt;&gt; where 试试 就是这样! Expression&lt;Func&lt;TEntidade, bool&gt;&gt; where 工作。谢谢! 【参考方案1】:

问题已通过Expression&lt;func&gt; 解决。

public IEnumerable<TEntidade> ObterEntidadesPor(Expression<Func<TEntidade, bool>> where)

    return SessionNH.Query<TEntidade>().Where(where);

在寻找答案时,一位同事告诉我,Func 在构建表达式之前执行查询。要在执行查询之前构建表达式,我们必须使用Expression

@RomanArtiukhin 在 cmets 的问题中也提到了这一点。

【讨论】:

以上是关于在 NHibernate 查询中实现条件的更好方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

实体框架与 NHibernate - 性能

如何在子查询中实现多列过滤

与 NHibernate 和标准联合?

如何使用 LINQ 在 NHibernate 3 中实现关键字搜索?

动态添加投影到 NHibernate 查询

nhibernate教程--条件查询(Criteria Query)