NHibernate 与 LINQ(谓词?)

Posted

技术标签:

【中文标题】NHibernate 与 LINQ(谓词?)【英文标题】:NHibernate with LINQ (predicates?) 【发布时间】:2012-02-21 15:44:49 【问题描述】:

如果我不清楚,请原谅我,我刚刚开始使用 NHibernate/LINQ/Lambda 表达式,实际上我不确定要查找什么...

在过去的 4 或 5 年里,我一直在使用 .NET 2.0,除了我自己之外没有机会发展,这就是我现在开始学习新技术的原因 :)

我已经阅读了很多博客和帖子,并开始了一个个人小项目,我尝试尽可能地使用存储库模式。

我现在处于以下情况:

MyProject.Core.dll:我有这个包含所有业务逻辑并设置 IRepository 合同的核心程序集。它对存储库的实际实现一无所知,它是在运行时使用 IoC 解析的,因此这个核心 dll 没有对 NHibernate dll 的引用。 MyProject.Data.NHibernate.dll:存储库的实现包含在此程序集中,该程序集具有对 NHibernate dll 的所有必要引用。

我的存储库实现如下所示:

public class GenericRepository<T> : IGenericRepository<T> where T : class

    ...
    public virtual IQueryable<T> All()
    
        IList<T> entities = Session
            .CreateCriteria( typeof( T ) )
            .List<T>();
        return entities.AsQueryable<T>();
    
    ...

所以在我的核心 dll 中,我可以获得对我的存储库的引用并执行以下操作:

IList<Person> people = myRepository.All().ToList();

这似乎运作良好,它查询数据库并返回 Person 表中的所有行。

但是,现在我要做的是添加谓词:

IList<Person> daves = myRepository.All().Where(p => p.Name == "Dave").ToList();

这很好用,但当然会发生的是 NHibernate 首先查询数据库以返回所有行,然后 LINQ 过滤结果以仅返回名称为“Dave”的那些。

我一直在寻找整个互联网,但我没有找到如何实现这个,我也发现了很多似乎已经过时的东西,例如,我经常看到对 NH session.Linq() 的调用方法,我翻遍了我的dll,找不到这个方法……

如果有人能指出我正确的方向,也许有一个小例子或其他东西,我会非常感激。

非常感谢!

【问题讨论】:

【参考方案1】:

很简单:

使用session.Query&lt;T&gt;():

public virtual IQueryable<T> All()

    return Session.Query<T>();

Query&lt;T&gt; 是位于命名空间NHibernate.Linq 中的扩展方法。

session.Linq 不再受支持。它是 NHibernate 版本 3 之前的 LINQ 提供程序,已被 Query&lt;T&gt; 取代。

【讨论】:

【参考方案2】:

您可能希望考虑将specification pattern 与您的存储库一起使用。 NHibernate 3.0 Cookbook 中有一个使用 NHibernate here 实现的示例,这是一个值得获取的极好资源。

【讨论】:

以上是关于NHibernate 与 LINQ(谓词?)的主要内容,如果未能解决你的问题,请参考以下文章

NHibernate Linq 提供程序中的 Fetch 与 FetchMany

NHibernate、Castle、Linq 之间的区别——它们针对谁?

使用 NHibernate 3.0 QueryOver 或 LINQ 提供程序的权衡

通过代码进行 Nhibernate 一对一映射

彻底检查电子邮件是不是存在,NHibernate,LINQ

NHIbernate 的替代品?