![](/img/trans.png)
[英]FluentNHibernate - ReferencesAny(), How to use QueryOver with filter?
[英]FluentNHibernate; How to use QueryOver to put filter on sub-level object?
我試圖了解如何檢索 object 圖,我想在子級別 object 上放置一個過濾器。 所以考慮下面的課程。 我希望查詢檢索 A 的完整集合,以及 B 的完整 collections,但對於 C 的 collections,我只想檢索基於“時間”屬性的特定日期范圍的元素。
我試圖理解這個材料: 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]”。
假設您想在某個時候將結果轉換為列表,我會使用:
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 子句。 要通過預先加載包含 collections,您需要使用 Fetch。
如果上面的答案給你重復,那是因為它是一個經典的 select n+1 問題。 請參閱http://ayende.com/blog/4367/eagerly-loading-entity-associations-efficiently-with-nhibernate
一種在沒有重復問題的情況下有效加載這些集合的方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.