2011-08-20 67 views
0

問題:給定一個NHibernate實體Parent,有沒有什麼辦法可以在數據庫端執行一個Children集合上的LINQ查詢,而不是延遲加載所有的子進程,然後執行查詢?如何優化LINQ到NHibernate延遲加載

場景:

父對象有IList的集合(兒童)

var parent = _parentRepository.Get(parentId); //loads parent 

..do stuff 

//this causes all Child objects to be loaded into memory 
//and then finds the subset of boy objects (not great performance) 
var boys = parent.Children.Where(t => t.Sex == 1); 

如果我試圖明確地傳遞一個Expression<Func<Child, bool>>,我得到一個錯誤,它的期待型Func<Child, bool>

有什麼辦法可以獲得更高效的延遲加載瓦特/ NHibernate的?

謝謝!

回答

1

在NHibernate中推薦的做法是保持會話壽命短,從而防止延遲加載。你可以通過應用「join fetch」(參考NHibernate文檔)來提高查詢的效率,順便說一下,它也可以讀取所有子對象,但是一次性讀取,而不是臭名昭着的1 + N反模式。

Children不是IQueryable所以你不能使用表達式。使用NHibernate的Linq將允許您用linq語句查詢會話,並將其轉換爲sql。然後你可以用表達式作爲謂詞查詢Children集合。

+0

是的,這就是我所害怕的 - 希望有人比我設計更高效的方法更聰明。 – sydneyos