2009-02-24 66 views
5

我有一個相當深的對象圖(5-6節點),當我遍歷它的一部分NHProf告訴我我有一個「選擇N + 1」的問題(我做)。防止流利NHibernate的選擇n + 1

這兩種方案我所知道的是

  1. 渴望負載孩子
  2. 掰開我的對象圖(和貪婪加載)

我真的不希望做任何(雖然我可能隨着它的增長,將圖分開)

現在......

是否有可能告訴NHibernate(使用FluentNHibernate)每當我嘗試訪問子進程時,一次加載它們,而不是select-n + 1-ing,因爲我迭代了它們?

我還得到了「無限結果集」,這大概是同樣的問題(或者說,如果可能,將通過上述解決方案來解決)。

每個孩子集合(在整個圖中)將只有大約20個成員,但20^5是很多,所以我不想急於加載一切,當我得到的根,但只是得到所有的兒童收集,只要我靠近它。

編輯:一個事後....如果我想介紹分頁,當我想要呈現兒童?我是否需要在這裏打破我的對象圖,還是有一些潛行我可以用來解決所有這些問題?

回答

9

在我看來,你想追求使用你的域模型的方法,而不是創建一個特定的nhibernate查詢來處理這種情況。鑑於此,我建議你看看你可以應用到你的集合的批量大小屬性。流利的NHibernate的流暢接口還不支持此屬性,但作爲一種解決方法,您可以使用:

HasMany(x => x.Children).AsSet().SetAttribute("batch-size", "20") 

鑑於對您的具體情況普遍缺乏信息,我不能肯定地說批量大小是否是理想的解決方案,但我當然建議你放棄它。如果你還沒有準備好,我建議你閱讀這些:

http://www.nhforge.org/wikis/howtonh/lazy-loading-eager-loading.aspx

http://nhibernate.info/doc/nhibernate-reference/performance.html

NHibernate的性能文檔將解釋如何批量大小的作品。

編輯:我不知道有任何方式來從您的域模型頁面。我建議你爲需要分頁的場景編寫NH查詢。

+0

」這聽起來對你來說,你想追求的是使用你的域模型的方法,而不是創建一個特定的nhibernate查詢來處理這種情況。「肯定。我想要的最後一件事是具體的查詢。我檢查了這些東西,ta – 2009-02-24 13:15:12

0

編輯:事後....如果我 要介紹的頁面時,我想 渲染的孩子嗎?我是否必須在這裏打破 我的對象圖,還是有一些 偷偷摸摸我可以用來解決所有這些問題 ?

那麼,如果你只加載孩子,那麼你可以頁面:)。但是,如果你想要的東西如:LoadParent和PageChildren,那麼我認爲你不能這樣做。「