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]'.
假设您希望在某个时候将结果强制转换为列表,我会使用:
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