循环层次结构到根

Posted

技术标签:

【中文标题】循环层次结构到根【英文标题】:Loop hierarchy to root 【发布时间】:2013-01-29 08:54:59 【问题描述】:

我需要将层次结构向下循环到根。 这是我的表格列

    身份证 父母身份 说明

我想你理解这个问题。 ParentId 为 NULL 的项是根。

例子

Id=1 ParentId=NULL 描述=Root Id=2 ParentId=1 Description=Id1 的子项

这可以使用 linq 完成吗?或者使用 sql 查询更好。

【问题讨论】:

您是说要返回特定项目的整个层次结构吗? 【参考方案1】:

在 Sql Server 上这样的东西可能是解决方案: 4 示例如果我们想递归查找 Child1 的根,我们可以使用

WITH n(ID, Description) AS 
   (SELECT ID, Description
    FROM yourTable
    WHERE Description = 'Child1'
        UNION ALL
    SELECT nplus1.ID, nplus1.Description
    FROM youTable as nplus1, n
    WHERE n.ID = nplus1.ParentID)
SELECT name FROM n

看看MSDN 4 WITH关键字 Oracle 服务器上的相同解决方案将使用

SELECT Description 
  FROM yourTable
  START WITH name = 'Child1'
  CONNECT BY PRIOR ID = ParentID

【讨论】:

【参考方案2】:

如果可以更改(反转)您的树结构以使节点包含其子节点而不是引用其父节点,如下所示:

    class Node
    
        public Guid Id  get; set; 
        public IEnumerable<Node> Children  get; set; 
        public string Description  get; set; 
    

然后很容易将树“展平”为具有如下扩展名的 IEnumerable:

    public static IEnumerable<T> FlattenedTree<T>(this T node, Func<T, IEnumerable<T>> getter)
    
        yield return node;
        var children = getter(node);
        if(children != null)
        
            foreach (T child in children)
            
                foreach (T relative in FlattenedTree(child, getter))
                
                    yield return relative;
                
            
        
    

你可以像这样在 linq 中使用你的树:

    var descriptions = MyTreeStructure.FlattenedTree(x => x.Children).Select(x => x.Description);

【讨论】:

以上是关于循环层次结构到根的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Hive/Pig/MapReduce 展平递归层次结构

如何让 Selenium 在层次结构下拉列表中循环

Android “只有创建视图层次结构的原始线程才能接触其视图。” for循环中的错误[重复]

处理规则层次结构/树的最佳方法

毕业了-二叉树层次遍历算法-借助循环队列这个数据结构来实现,悟:数据结构是用来实现算法的

SQL Server 基于集合的 while 循环避免万圣节保护 (LAHP) 用于层次结构透视将某些结果减半