次のデータベース構造があり、レポートのために完全にトラバースする必要があります。
Product -> ProductVariation -> ProductMedaItem
Product -> CategoryLinks -> Category
テーブルにクエリがありProducts
、上記のデータをまとめてアクセスするため、これらのデータをプリフェッチしたいと考えています。組み合わせが爆発してデータの負荷が発生するため、JOIN の使用は避けたいと思います。
私の目の理想的な解決策は次のとおりです。
- 一致するすべての製品をロードするためのクエリが発行されます
Select * from ProductVariations where ProductId in ([all_product_id_set])
次に、結果セットが解析され、' ;のようなクエリに基づいて、すべての製品バリエーションが一緒に読み込まれます。- 繰り返しますが、この結果セットは解析され、次
ProductMediaItem
のようなクエリを使用してすべてがフェッチされますSelect * from ProductMediaItem where ProductVariationId in ([all_product_variation_id_set]);
- などなど
これにより、SELECT
異なる関連付けごとに 1 つになります。したがって、すべての製品バリエーション、そのメディア アイテム、各製品カテゴリ リンク、およびそれぞれのカテゴリを読み込むには 5SELECT
秒かかります。
を使用してみcriteria.SetFetchMode("ProductVariations", FetchMode.Select")
ましたが、これは何もしません。私の現在の回避策はバッチ処理を使用することですが、これでもすべてのデータを取得するために約 50 ~ 60 のクエリが発生します。それほど遅くはありませんが、はるかに高速化できると思います。
NHibernate の最新バージョン - 3.3 を使用しています。
更新 1
通常の OOP を使用してコレクションをトラバースしたいと思います。例:
foreach (var p in Products)
{
foreach (var variation in p.ProductVariations)
{
foreach (var mediaItem in variation.MediaItems)
{
...
}
}
}