请原谅我,如果我有点不清楚,我刚刚开始使用NHibernate / LINQ / Lambda表达式,我实际上不确定要查找什么......
过去4到5年我一直在使用.NET 2.0,除了我自己之外没有机会进化,这就是为什么我现在开始学习新技术:)。
我一直在阅读很多博客和帖子,并开始了一个个人的小项目,我尽可能地尝试使用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过滤结果只返回其名称为&#34; Dave&#34;。
我一直在寻找互联网,但我还没有找到如何实现这一点,我发现许多事情似乎已经过时,例如,我经常看到呼叫NH会议.Linq()方法,我看了我的dll,这个方法无处可寻......
如果有人能指出我正确的方向,也许还有一些例子,我会非常感激。
非常感谢你!
答案 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的实现示例,这是一个很有价值的资源。