gpt4 book ai didi

linq - NHibernate 与 LINQ(谓词?)

转载 作者:行者123 更新时间:2023-12-04 19:59:55 25 4
gpt4 key购买 nike

如果我有点不清楚,请原谅我,我刚刚开始使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com