我已經擺脫如何做到這一點:NHibernate,獲取實體和孩子集合的熱切加載部分
我有一個國家實體。一個國家有零或更多的事實。事實上有一個叫做Year的屬性。
如何通過名稱加載國家/地區實體並熱切地從給定年份獲取所有事實,例如2011年(但沒有載入所有其他事實)?這甚至有可能嗎?
我已經擺脫如何做到這一點:NHibernate,獲取實體和孩子集合的熱切加載部分
我有一個國家實體。一個國家有零或更多的事實。事實上有一個叫做Year的屬性。
如何通過名稱加載國家/地區實體並熱切地從給定年份獲取所有事實,例如2011年(但沒有載入所有其他事實)?這甚至有可能嗎?
我相信這是可能的在nHibernate中使用過濾器。開始時通過閱讀這篇先前StackOverflow的問題:
NHibernate - Retrieve parent/children with criteria applied only to children
,也有看看NHibernate的文檔獲取更多參考:
編輯:
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();
更新: 我有不是解決了這個問題。下面的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解決方案感興趣,但是這很好地解決了這個問題。
我認爲這可以使用過濾,但它不是一個好主意,因爲它違反了關注點的分離:您的域模型不應該用於呈現數據的特殊視圖。
兩個可能更好的選擇:
IEnumerable<Fact>
逐年進行篩選。除非我有可衡量的性能問題,否則我會選擇此選項。Future
構建這兩個查詢來檢索一年的國家/地區和事實,以便只需要一次訪問數據庫。謝謝傑米。我同意過濾不是正確的方法。 –
嗨Mariusz,謝謝你的回答。不幸的是,這似乎並沒有編譯? 「預計會有方法,委託或事件。」另外,表達式f => f.Year == 2011不會被編譯爲「f」。 –
好的 - 對Eager的調用應該是對屬性的調用,而不是方法。但Where()子句不能編譯becase f是國家,而不是事實 –
給我第二個plz – Mariusz