2011-05-24 99 views
3

我有一個擁有多個嵌套關聯的數據庫。基本上,結構如下:熱切地使用nhibernate(和queryover)獲取多個嵌套關聯

Order -> OrderItem -> OrderItemPlaylist -> OrderPlaylistItem -> Track -> Artist 

我需要生成基於在一定的日期,這需要遍歷到所有提到的團體,以便生成所需的信息出售的所有訂單報告。

嘗試將所有表連接在一起將會是一個矯枉過正的問題,因爲它會導致與大量冗餘數據的非常大的笛卡爾連接,因爲它會將6個表連接在一起。代碼如下:

q.Left.JoinQueryOver<OrderItem>(order => order.OrderItems) 
    .Left.JoinQueryOver<OrderItemPlaylist>(orderItem => orderItem.Playlist) 
    .Left.JoinQueryOver<OrderItemPlaylistItem>(orderItemPlaylist => orderItemPlaylist.PlaylistItems) 
    .Left.JoinQueryOver<Track>(orderItemPlaylistItem => orderItemPlaylistItem.Track) 
    .Left.JoinQueryOver<Artist>(track => track.Artist) 

上述工作,但即使是幾個訂單,每幾個訂單項,每個由多個音軌的播放列表,結果會爆炸上千個記錄,每個額外的成倍增長訂購。

任何想法什麼是最好和最有效的方法?我目前已經嘗試啓用批量加載,這大大縮減了數據庫查詢的數量,但對我來說似乎並不是一個好方法,但更像是一種「簡單解決方法」。

在給定大量數據的情況下,不需要僅僅在一個SQL查詢中加載所有數據。我猜想每個關聯的一個SQL查詢將是完美的。理想情況下,首先您可以獲得所有訂單,然後獲取訂單的所有訂單項並將其加載到關聯的集合中,然後加載每個訂單項的播放列表,等等。

此外,這不必特別在QueryOver中,因爲我可以訪問.RootCriteria並使用Criteria API。

任何幫助將不勝感激!

回答

0

如果你更喜歡一個SQL查詢,你會期望這個SQL語法產生什麼?我想如果你想要一個SQL查詢,你無法避免一長串的JOIN

我想我會做的是使用多個查詢逐級獲取實體。

+0

我想,有沒有辦法讓他們都在同一個查詢,而無需使用6連接,這將是一個矯枉過正的問題。考慮到我在NH上有點新,我更要問什麼是最有效的方法。 – 2011-05-27 12:29:43

0

您應該首先定義查詢,儘可能在SQL中定義查詢執行計劃以找到最佳方法(以及索引是否足夠)。

當時你知道你在拍什麼,然後在HQL或QueryOver甚至LINQ中嘗試編碼查詢並在NHibernate中使用SQL編寫器檢查結果,或者使用優秀的NHProfiler http://www.nhprof.com

您可能正確地結束了幾個查詢。通過在Criteria或QueryOver中使用「Future」命令,儘可能多地(不依賴於彼此)將它們加速到單次行程中,從而加快速度。你可以閱讀更多有關在這裏:http://ayende.com/blog/3979/nhibernate-futures