2010-12-10 134 views
9

我正在創建一個使用nhibernate和分頁的mvc應用程序。我有一個父母>孩子的關係,我試圖加載我的孩子記錄。這一切工作正常。nhibernate,急切的加載和分頁

我遇到的問題是分頁。我想每頁有15個項目。如果每個家長只有一個孩子,這完美地工作。問題是當父母有一個以上的孩子時。例如,如果父代有兩個子記錄,那麼數據庫實際上會選擇15個記錄,其中兩個記錄代表同一個父代,兩個子代各有一個記錄。因此,在我的數據視圖中,看起來只有14條記錄。

有沒有人知道我可能會如何去獲取我的頁面計數由父只有仍然渴望加載我的子實體?
這將是一個面向公衆的網站,所以我認爲這不是一個好的主意,延遲加載,因爲它會導致太多的旅行到服務器。

有沒有內置到NHibernate中可能處理這個,我失蹤?

感謝您的任何想法。

回答

0

您需要在查詢中使用不同的根實體結果轉換器。你還沒有說過你是使用HQL還是Criteria,但是這兩個API都是相似的。

// criteria 
criteria.SetResultTransformer(Transformers.DistinctRootEntity) 

這將強制結果集僅包含不同的父實體。

+2

我正在使用不同的根實體,但它仍然每次計數多個子項目,而不僅僅是計算不同的父項目。 – czuroski 2010-12-10 16:03:53

+0

@詹姆斯格雷戈裏 - 你的建議將無法正常工作,因爲分頁通常表示爲SELECT TOP(@ p0)....並且如果有急切的加載,您將加入,這將使一些實體顯得遠遠超出TOP的限制。 – 2012-03-21 15:25:24

1

您可以使用fetch="subselect"來標記您的關聯屬性 - 這也可以確保您不會遇到大型笛卡爾產品的問題,但需要花費兩次查詢。

0

在您的子集合映射中使用batch-size提示可能是解決此問題的最佳/最簡單的方法。有關進一步的討論,請參閱我的回答similar question

+0

換句話說,這個答案不是使用急切加載,而是建議在延遲加載時啓用批處理以切換到延遲加載,以避免N + 1性能問題。 – 2015-04-10 14:30:57