2011-06-27 8 views
0

ツリー構造とフィルタをツリールートに適用する際に問題があります。私は、ツリーの非常にルートにフィルタを適用するNHibernateの基準を使用してクエリを作成する必要があります(複数のツリーが存在する可能性があり、ルートのIDを指定する必要があります)。NHibernateと再帰的クエリフィルタ

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 

このクエリは、私がしたい正確に何を返しますが、それは大きなクエリの一部のみです:普通のSQLでは、これはかなったようになります。私が必要とするのは、同じ結果を作成するために基準apiを使うことです:与えられたルートIDを持つアイテムのリスト(ツリー構造は必要ありません。これは "search"コマンドの結果です。必須)。 Unfortunatelly私はNHibernateの専門家ではないので、...任意のガイド、アイデアが役立つだろう。

答えて

1

私はあなたのSQLをそのままにしておくことをお勧めします。基準でそれをやろうとしないでください。

は、上記の再帰クエリを実行します。Expression.SQL()はWHERE句...あなたはあなたの方法では2段階のプロセスを適用することができたに関連するSQLを置くよう

+0

私は言ったように、これはより大きな処理の一部であり、残りは基準APIを使用すると述べました。私の知る限り、単純なSQLの広告基準APIを1つのクエリに混在させることはできませんか?そうでないと、既存のコードにこのフィルタを追加する方法を見つける必要があります。 – user817409

+0

@ user817409:同じクエリでそれらを混在させることはできませんが、それは正しいです。しかし、ネイティブNH APIのどれも再帰クエリをサポートしていないので、必要な場合はSQLに悩まされています。 –

0

あなたは、基準とSQLではなく、CTEを混在させることができますプレーンSQLで、ある種のID(c.Child)と、それが単一行の場合はRestrictions.Eqで使用できるその製品、または返されたIDのコレクションの場合はRestrictions.Inを返します。