我正在尝试了解如何检索对象图,我想在子对象上放置一个过滤器。所以考虑下面的课程。我希望查询检索A的完整集合及其完整的B集合,但对于C的集合,我只想根据“time”属性检索特定日期范围的元素。
我正在尝试理解这些材料: http://nhforge.org/blogs/nhibernate/archive/2009/12/17/queryover-in-nh-3-0.aspx#Associations
也许它应该是显而易见的,但我很难看到如何使用这个第3级限制的扩展。所以真的很感激一些帮助。
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.Criterion.QueryOver
2[A,C]' to type 'NHibernate.IQueryOver
2 [A,B]'类型的对象。
答案 0 :(得分:0)
假设您想在某个时刻将结果转换为列表,我会使用:
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。
答案 1 :(得分:0)
如果上面的答案给你重复,那是因为它是一个经典的选择n + 1问题。见http://ayende.com/blog/4367/eagerly-loading-entity-associations-efficiently-with-nhibernate
有效地加载这些集合而没有重复问题。