FluentNHibernate;如何使用QueryOver在子级对象上放置过滤器

本文关键字:对象 过滤器 何使用 QueryOver FluentNHibernate | 更新日期: 2023-09-27 18:05:49

我试图了解如何检索对象图,我想在子级对象上放置过滤器。所以考虑到下层阶级。我希望查询检索A的完整集合及其B的完整集合,但对于C的集合,我只想检索基于"time"属性的特定日期范围的元素。

我正在努力理解这个材料:http://nhforge.org/blogs/nhibernate/archive/2009/12/17/queryover - - nh - 3 - 0. aspx #协会

也许这应该是显而易见的,但我很难看到如何使用扩展为这第三级限制。所以我真的很感激你的帮助。

 Class A
   public List<B> Bs;
 Class B
   public List<C> Cs;
 Class C
   public DateTime time;

我到目前为止的尝试:但是它给出了例外;

IQueryOver<A, B> q = session.QueryOver<A>()
    .JoinQueryOver<B>(a => a.Bs).JoinQueryOver<C>(b => b.Cs)
    .Where(e => e.time.Date == System.DateTime.UtcNow.Date);

无法强制转换类型' nhibernate . criteria . queryover 2[A,C]' to type 'NHibernate.IQueryOver 2[A,B]'.

FluentNHibernate;如何使用QueryOver在子级对象上放置过滤器

假设您希望在某个时候将结果强制转换为列表,我会使用:

session.QueryOver<A>()
.JoinQueryOver<B>(a => a.Bs)
.Fetch(a => a.Bs).Eager
.JoinQueryOver<C>(b => b.Cs)
.Where(e => e.time.Date == System.DateTime.UtcNow.Date).List<A>

关键是JoinQueryOver仅用于构建where子句。要通过主动加载来包含集合,你需要使用Fetch.

如果上面的答案给你重复的,那是因为这是一个经典的选择n+1问题。见http://ayende.com/blog/4367/eagerly-loading-entity-associations-efficiently-with-nhibernate