NHibernate和递归查询过滤器

NHibernate和递归查询过滤器,nhibernate,recursion,filter,criteria,Nhibernate,Recursion,Filter,Criteria,我在树结构和对树根应用过滤器方面有问题。我需要使用NHibernate条件创建一个查询,它将对树的根应用过滤器(可以有多个树,我需要提供根的ID)。在普通sql中,这看起来像: WITH c ( Node, Parent, Child, LEVEL ) AS ( SELECT N.CatalogNodeId , N.ParentCatalogNodeId , N.CatalogNodeId ,

我在树结构和对树根应用过滤器方面有问题。我需要使用NHibernate条件创建一个查询,它将对树的根应用过滤器(可以有多个树,我需要提供根的ID)。在普通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

这个查询返回的正是我想要的,但它只是更大查询的一部分。我需要的是使用CriteriaAPI创建相同的结果:一个具有给定根ID的项目列表(不需要保持树结构-它是“search”命令的结果,所以只需要一个条目集合)。不幸的是我不是NHibernate专家所以。。。任何指南、想法都会很有帮助。

我的建议是保持SQL的原样。甚至不要尝试对条件执行此操作。

您可以将SQL与条件混合使用,但不能使用cte,因为
表达式。SQL()
将相关SQL放在WHERE子句中。。。也就是说,您可以在方法中应用两个步骤:


在纯sql中执行上述递归查询,它将返回某种类型的Id(
c.Child
),并且该产品可以与限制一起使用。Eq(如果是单行)或Restrictions.in(对于返回的Id集合)。

我会这样做,但正如我所说的,这只是更大处理的一部分,其余部分使用criteria api。据我所知,不可能在单个查询中混合使用纯sql ad criteria api(是否?),因此我必须找到某种方法将此筛选器添加到现有代码中。@user817409:不可能在同一查询中混合使用它们,这是正确的。但是没有一个原生NHAPI支持递归查询,所以如果需要的话,只能使用SQL。