2011-08-16 37 views
1

我想了解如何檢索一個對象圖,我想在其中一個子級別的對象上放置一個過濾器。所以考慮下面的課程。我希望查詢檢索A的完整集合,以及它們完整的B集合,但對於C集合,我只想根據「time」屬性檢索特定範圍的日期元素。FluentNHibernate;如何使用QueryOver將過濾器放在子級別對象上?

我想了解這種材料: http://nhforge.org/blogs/nhibernate/archive/2009/12/17/queryover-in-nh-3-0.aspx#Associations

也許這應該是顯而易見的,但我有一個很難看到如何使用擴展這個第三級限制。所以真的很感謝一些幫助..

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

「var」解決了這個問題。從例外消息我會說你只需將IQueryOver 更改爲IQueryOver 。第二個泛型可能總是你最後的JoinQueryOver。另一種方法是使用別名的連接(我的偏好)。 – Sam

回答

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。

相關問題