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