【问题标题】:NHibernate and recursive query filterNHibernate 和递归查询过滤器
【发布时间】:2011-06-27 13:21:47
【问题描述】:

我对树结构和对树根应用过滤器有疑问。我需要使用 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

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

【问题讨论】:

    标签: nhibernate recursion filter criteria


    【解决方案1】:

    我的建议是保持 SQL 不变。甚至不要尝试使用 Criteria 这样做。

    【讨论】:

    • 我愿意,但正如我所说,这只是更大处理的一部分,其余的使用标准 api。据我所知,不可能在单个查询中混合普通的 sql 广告标准 api(或者不是?),所以我必须找到某种方法将此过滤器添加到现有代码中。
    • @user817409:不可能将它们混合在同一个查询中,这是正确的。但是没有一个原生的 NH API 支持递归查询,所以如果你需要的话,你只能使用 SQL。
    【解决方案2】:

    您可以将 SQL 与条件混合,但不能将 cte 与 Expression.SQL() 将相关的 sql 放在 WHERE 子句中......这表示您可以在您的方法中应用两步过程:

    在纯 sql 中执行上述递归查询,它会返回某种类型的 Id (c.Child),如果它是单行,您可以使用 Restrictions.Eq 或 Restrictions.In 返回的集合身份证。

    【讨论】:

      猜你喜欢
      • 2017-05-11
      • 1970-01-01
      • 1970-01-01
      • 2011-06-11
      • 1970-01-01
      • 1970-01-01
      • 2017-09-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多