0

Orchard の Projections モジュールには次の問題があります。
メイン カテゴリを含むページがあり、開いたときにデータベース (別のアプリケーションから取得した Orchard のデータベースではありません) に対して、そのサブカテゴリとそれらのサブカテゴリ内のアイテムをクエリします。

簡単にナビゲーションできるように、主要なカテゴリのタイトルをウィジェットに表示するプロジェクションがあります。ただし、プロジェクションでも各メインカテゴリを全体としてロードしようとするため、ページのロード時間は急増し、2 番目のデータベースに対して指数関数的な量のクエリが発生し、ロード時間が 30 秒を超えます。

プロジェクション モジュールがタイトル パーツ (およびおそらく任意のカスタム バインディング) のみをクエリし、それらのクエリを実行する部分を無視することは可能ですか?

前もって感謝します。

編集

Mini Profiler を使用した結果は次のとおりです。
ミニプロファイラ出力

問題は、111 行目の Orchard.Projections.Drivers.ProjectionPartDriver の Display メソッドにあるようです。

var contentItems = _projectionManager.GetContentItems(query.Id, pager.GetStartIndex() +     part.Record.Skip, pager.PageSize).ToList();

私はそれについて何ができますか?

4

1 に答える 1

1

この N+1 クエリの問題は、一部のパーツのレコードが遅延ロードされていることが原因であると考えられます。したがって、アクセスされたパーツごとにフェッチされたアイテムごとに 1 つの後続のクエリになります。

ContentQuery には、IHqlQuery (Projector フィルターで使用されるクエリ) でパーツ レコードを熱心にロードするための QueryHints があり、その Join() メソッドを使用してテーブルに結合 (= 熱心にロード) できます。ただし、これにはコードを記述する必要があります。テーブルに結合するだけの Projector フィルター プロバイダーを作成し、このフィルターをそれぞれのクエリで使用します。

プロジェクターで熱心にロードするためのより簡単なオプションは知りませんが、検討する価値は十分にあります。これについて問題を開かないのはなぜですか?

于 2013-05-11T10:36:15.073 に答える