2012-11-21 53 views
0

我已經擺脫如何做到這一點:NHibernate,獲取實體和孩子集合的熱切加載部分

我有一個國家實體。一個國家有零或更多的事實。事實上有一個叫做Year的屬性。

如何通過名稱加載國家/地區實體並熱切地從給定年份獲取所有事實,例如2011年(但沒有載入所有其他事實)?這甚至有可能嗎?

回答

0

編輯:

var query = session.QueryOver<Country>() 
     .Fetch(c => c.Facts) 
     .Eager() 
     .TransformUsing(NHibernate.Transform.Transformers.DistinctRootEntity) 
     .Future(); 
    session.QueryOver<Facts>() 
     .Where(f => f.Year == 2011) 
     .Future(); 
    var country = query.List().FirstOrDefault(); 
+0

嗨Mariusz,謝謝你的回答。不幸的是,這似乎並沒有編譯? 「預計會有方法,委託或事件。」另外,表達式f => f.Year == 2011不會被編譯爲「f」。 –

+0

好的 - 對Eager的調用應該是對屬性的調用,而不是方法。但Where()子句不能編譯becase f是國家,而不是事實 –

+0

給我第二個plz – Mariusz

0

更新: 我有不是解決了這個問題。下面的HQL只有在事實存在時纔有效。如果某一年沒有事實,則結果爲空。根據我的上下文,我認爲正確的解決方案是將事實視爲聚合根,並使用Future()發出兩個查詢。

原帖

我已經解決了這個使用HQL:

var country = Session.CreateQuery("from Country country left join fetch country.Facts as Facts where Facts.Year in (:years) and country.Name = :name "); 
country.SetParameter("name", name); 
country.SetParameterList("years", new List<int>() {2012, 2011}); 

感謝其他建議。我會對這個問題的非HQL解決方案感興趣,但是這很好地解決了這個問題。

2

我認爲這可以使用過濾,但它不是一個好主意,因爲它違反了關注點的分離:您的域模型不應該用於呈現數據的特殊視圖。

兩個可能更好的選擇:

  1. 抓取所有的事實,並使用擴展方法上IEnumerable<Fact>逐年進行篩選。除非我有可衡量的性能問題,否則我會選擇此選項。
  2. 創建一個封裝了結果集的視圖類。您可以使用Future構建這兩個查詢來檢索一年的國家/地區和事實,以便只需要一次訪問數據庫。
+0

謝謝傑米。我同意過濾不是正確的方法。 –

相關問題