我想创建一个“可选方法”(不管是 View 、函数、存储过程还是其他东西,我不知道是否有其他方法)来获取所有直接 parent 和所有 child 、孙子、孙子等来自自引用表的记录。
我想从 C# (.NET) 调用的“可选方法”

我们有一个名为 entities 的表,它有(除其他外)一个属性 parentId ,它指的是 Id 表的 entities 字段。通过这种方式,我们对实体树进行建模(在我们的案例中为建筑物、房屋、楼层、房间等元素)

父节点(如果可视化)是与根元素形成直线的节点。

如果可视化,子节点可以“展开”。

如果选择必须在两个单独的语句中完成,那也没关系。

在 C# 中,我知道如何做到这一点,但我不想向数据库发出大量请求,我认为 Sql Server 可以自己快速(呃)做到这一点,但我不知道如何:-)

最佳答案

尝试使用以下递归 CTE 作为解决方案的基础:

WITH TREE AS (
  SELECT     ROOT.Id
            ,ROOT.ParentId
            ,ROOT.Prop1
            ,ROOT.Prop2
            ...
            ,ROOT.PropN
            ,1 AS Level
  FROM       ENTITIES ROOT
  -- list entities starting from ROOT node (no ParentId)
  WHERE      ROOT.ParentId IS NULL
  -- or list entities starting from a specified node
  -- WHERE ROOT.Id = @entityId

  UNION ALL

  SELECT     CHILD.Id
            ,CHILD.ParentId
            ,CHILD.Prop1
            ,CHILD.Prop2
            ...
            ,CHILD.PropN
            ,PARENT.Level + 1
  FROM       ENTITIES CHILD INNER JOIN
             TREE PARENT ON CHILD.ParentId = PARENT.Id
  WHERE      CHILD.ParentId IS NOT NULL
)

SELECT *  FROM TREE

如果需要传递参数,可以将 CTE 放在 VIEWStored Procedure 中。

关于c# - 从自引用表中获取所有子项(子项、孙子项)和父项,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24569451/

10-12 23:42