将层次结构循环到根

时间:2013-02-13 17:54:36

标签: c# linq sql-server-2008

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

  1. 编号
  2. 的ParentId
  3. 描述
  4. 我想你明白了这个问题。具有ParentId NULL的项是根。

    实施例

    • Id = 1 ParentId = NULL Descripion = Root
    • Id = 2 ParentId = 1 Descripion = Id1的子项

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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

    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);