2009-07-27 7 views
0

私の状況は次のとおりです。多対多の関係を持つエンティティがあります。製品とカテゴリ。また、カテゴリには木のような階層構造があります。すべての子(ブランチ)で特定のカテゴリに依存するすべての製品を選択する必要があります。だから、私はそれを行うには、次のSQLステートメントを使用します。NHibernate:最適化と動的結合のための値テーブルの使用

SELECT * FROM Products p 
WHERE p.ID IN (
    SELECT DISTINCT pc.ProductID FROM ProductsCategories pc 
    INNER JOIN Categories c ON c.ID = pc.CategoryID 
    WHERE c.TLeft >= 1 AND c.TRight <= 33378 
) 

しかし、データの大きなセットでこのクエリは非常に長く実行し、私はそれを最適化するためにいくつかの解決策を見つけ、ここを見て:

DECLARE @CatProducts TABLE (
    ProductID int NOT NULL 
) 

INSERT INTO @CatProducts 
    SELECT DISTINCT pc.ProductID FROM ProductsCategories pc 
    INNER JOIN Categories c ON c.ID = pc.CategoryID 
    WHERE c.TLeft >= 1 AND c.TRight <= 33378 

SELECT * FROM Products p 
INNER JOIN @CatProducts cp ON cp.ProductID = p.ID 

このクエリは非常に高速で実行されますが、私はNHIbernateでこれを行う方法がわかりません。動的フィルタリング\注文のためICriteriaのみを使用する必要があることに注意してください。 解決策を知っている人がいれば、それは素晴らしいでしょう。しかし、私はもちろん、どんな提案にも喜ぶでしょう。

が先にありがとう、 のKostya

答えて

0

答えは簡単である - のProductID列が問題を修正するためにProductsCategoriesテーブルにインデックスを追加します。

関連する問題