NHibernate与LINQ(谓词?)

时间:2012-02-21 15:44:49

标签: linq nhibernate predicates

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

过去4到5年我一直在使用.NET 2.0,除了我自己之外没有机会进化,这就是为什么我现在开始学习新技术:)。

我一直在阅读很多博客和帖子,并开始了一个个人的小项目,我尽可能地尝试使用Repository模式。

我现在处于以下情况:

  • 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过滤结果只返回其名称为&#34; Dave&#34;。

我一直在寻找互联网,但我还没有找到如何实现这一点,我发现许多事情似乎已经过时,例如,我经常看到呼叫NH会议.Linq()方法,我看了我的dll,这个方法无处可寻......

如果有人能指出我正确的方向,也许还有一些例子,我会非常感激。

非常感谢你!

2 个答案:

答案 0 :(得分:7)

这很简单:

使用session.Query<T>()

public virtual IQueryable<T> All()
{
    return Session.Query<T>();
}

Query<T>是一种扩展方法,位于命名空间NHibernate.Linq中。

session.Linq不再受支持。它是版本3之前的NHibernate的LINQ提供程序,已被Query<T>替换。

答案 1 :(得分:0)

您可能希望将specification pattern与您的存储库一起使用。 NHibernate 3.0 Cookbook中有一个NHibernate here的实现示例,这是一个很有价值的资源。