簡體   English   中英

流暢的NHibernate; 如何使用 QueryOver 在子級別 object 上放置過濾器?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM