2012-02-21 103 views
2

请原谅我,如果我有些不清楚,我刚开始使用NHibernate的/ LINQ/Lambda表达式,而我其实不确定该怎么找...NHibernate的使用LINQ(谓词?)

我在过去的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对结果进行过滤只返回名字是“戴夫”的人。

我一直在寻找遍布互联网,但我还没有找到如何实现这一点,我也发现很多似乎已经过时的事情,例如,我经常看到呼叫NH会议。林克( )方法,我看着我的所有DLL,这种方法是无处可寻...

如果任何人都可以指向我的正确方向,也许有一个小例子或什么的,我会非常感激。

非常感谢你!

回答

7

这是很简单的:

使用session.Query<T>()

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

Query<T>是住在命名空间NHibernate.Linq的扩展方法。

session.Linq不再支持。这是NHibernate在版本3之前的LINQ提供者,已被替换为Query<T>

+0

是的!有用!!非常感谢你! :) – Seb 2012-02-23 16:07:22

0

您可能想要将specification pattern与您的存储库配合使用。 NHibernate 3.0 Cookbook提供了NHibernate here的一个实现示例,这是一个值得一看的优秀资源。

+0

啊,我不知道这种模式,看起来不错,我要看看谢谢! – Seb 2012-02-23 16:13:44

-1

你可以看到仓库实现的例子here