2009-07-27 6 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 из-за динамической фильтрации \ упорядочения. Если кто-то знает решение для этого, он будет фантастическим. Но я, конечно же, буду рад любым предложениям.

Спасибо вперед, Костя

ответ

0

Ответ прост - добавление индекса к таблице ProductsCategories для столбца ProductID исправили проблему.

Смежные вопросы