linq - NHibernate 与 LINQ(谓词?)

标签 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 的所有必要引用。

我的 Repository 实现看起来像这样:

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,找不到这个方法...

如果有人能给我指出正确的方向,也许可以举个例子什么的,我会非常感激。

非常感谢!

最佳答案

很简单:

使用 session.Query<T>() :

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

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

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

关于linq - NHibernate 与 LINQ(谓词?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9380475/

相关文章:

java - 为什么 Predicates.instanceOf 返回 false?

linq - .SelectMany() 并从多个相关表中获取数据

c# - 为什么添加这一行会弄乱我的 NHibernate 映射?

c# - 为什么 DefaultIfEmpty 是这样实现的?

nHibernate 复合键类类型不匹配

nhibernate - 通过NHibernate元数据查找基础列大小

c# - 如何在 C#/Visual Studio 中调试谓词?

database - 查询 Realm 数据库以返回日期

c# - 使用表达式树为新类创建 Lambda 表达式选择器

c# - LINQ 表达式未正确评估