2013-05-10 30 views
0

的,我有以下問題,在果園的投影模塊:
我有一個主要類別的網頁上,當打開查詢數據庫(不是烏節之一,從一個單獨的應用程序來)是它的子類別和這些子類別中的項目。如何防止果園預測從發射數百查詢

我有一個投影顯示小部件中的主要類別標題,以方便導航。然而,頁面加載時間卻一路飆升,因爲即使在投影中,它也會嘗試加載每個主類別作爲一個整體,導致對我們的第二個數據庫進行指數級查詢,加載時間超過30秒。

投影模塊是否可能只查詢標題部分(也可能是任何自定義綁定)並忽略執行這些查詢的部分?

在此先感謝。

編輯

我們使用的迷你探查,這是結果:
mini-profiler output

看來這個問題是Orchard.Projections.Drivers.ProjectionPartDriver的顯示方法,第111行:

​​

我該怎麼辦呢?

回答

1

我認爲這個N + 1查詢問題是由於某些部分的記錄被延遲加載的事實造成的,因此這是每個被訪問部分的每個獲取項的後續查詢。

ContentQuery中有QueryHints用IHqlQuery(投影機過濾器中使用的查詢)急切加載部分記錄,您可以使用它的Join()方法加入(=急切加載)表。然而,這需要您編寫代碼:創建一個只加入表格的Projector過濾器提供程序,然後將這個過濾器與相應的查詢結合使用。

我不知道任何簡單的選項用於投影機的急切加載,但它是值得探索的東西。你爲什麼不開個問題呢?

+0

問題是,第二個數據庫的代碼不是像Orchard自己使用的NHibernate,而是使用Entity Framework。被加載的部分在Entity Framework中執行(通過管理器)大量查詢。我現在正在試圖構建緩存。 是否有可能使用過濾器來防止加載除標題部分以外的任何內容? 你會問我在這個問題btw報告? – Ytrog 2013-05-13 08:35:56

+1

只加載其屬性被訪問的部件。大多數情況下,這意味着只有顯示內容的部分纔會被加載:使用Placement.info隱藏除Parts_Title之外的所有內容應該可以解決問題。我想過爲投影儀查詢創建一個急切加載部分記錄的問題。 – Piedone 2013-05-13 12:38:49

+0

即使他們不是可見的,你是否應該用placement.info來隱藏它們? – Ytrog 2013-06-07 12:18:20