NHibernate与LINQ(谓词?)

3
请原谅我有些不清楚,因为我刚开始接触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文件,但是这个方法无处可寻...
如果有人能指导我正确的方向,也许附带一个小例子之类的,我将非常感激。
非常感谢!
2个回答

7
很简单:
使用 session.Query<T>():
public virtual IQueryable<T> All()
{
    return Session.Query<T>();
}

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

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


0

你可能想要考虑在你的仓储中使用规范模式。NHibernate 3.0 Cookbook 中有一个实现示例,在这里,这是一个非常值得获取的优秀资源。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接