NHibernate и рекурсивный фильтр запросов - PullRequest
0 голосов
/ 27 июня 2011

У меня проблема с древовидной структурой и применением фильтров к корню дерева.Мне нужно создать запрос с использованием критериев NHibernate, который будет применять фильтр к самому корню дерева (может быть более одного дерева, и мне нужно предоставить идентификатор корня).В простом sql это будет выглядеть примерно так:

WITH    c ( Node, Parent, Child, LEVEL )
      AS ( SELECT   N.CatalogNodeId ,
                    N.ParentCatalogNodeId ,
                    N.CatalogNodeId ,
                    CAST(0 AS BIGINT)
           FROM     CatalogNode N
           WHERE    N.ParentCatalogNodeId IS NULL
           UNION ALL
           SELECT   C.Node ,
                    N.ParentCatalogNodeId ,
                    N.CatalogNodeId ,
                    C.Level + 1
           FROM     CatalogNode N
                    JOIN c ON C.Child = n.ParentCatalogNodeId
         )
SELECT  
        c.Child
FROM    c
        JOIN dbo.CatalogItem CI ON Ci.CatalogNodeId = c.Child
        JOIN dbo.Item I ON I.ItemId = CI.ItemId
WHERE   C.Node = @Node_Id

Этот запрос возвращает именно то, что я хочу, но это только часть большего запроса.Мне нужно использовать критерии API для создания того же результата: список элементов с заданным корневым идентификатором (сохранение древовидной структуры не требуется - это результат команды «поиск», поэтому просто набор записейтребуется).К сожалению, я не эксперт NHibernate, поэтому ... любые руководства, идеи будут полезны.

Ответы [ 2 ]

1 голос
/ 27 июня 2011

Мое предложение состоит в том, чтобы вы сохранили свой SQL как есть. Даже не пытайтесь делать это с критериями.

0 голосов
/ 01 июля 2011

Вы можете смешивать SQL с критериями, но не cte, поскольку Expression.SQL() помещает соответствующий SQL в предложение WHERE ... при этом вы можете применить двухэтапный процесс в своем методе:

выполняет приведенный выше рекурсивный запрос на простом sql, и он возвращает Id некоторого вида (c.Child) и тот продукт, который вы можете использовать с Restrictions.Eq, если это одна строка, или Restrictions.In для возвращенной коллекции идентификаторы.

...