1

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

  1. ID
  2. 父 ID
  3. 描述

我想你明白这个问题。ParentId 为 NULL 的项目是根。

例子

  • Id=1 ParentId=NULL 描述=根
  • Id=2 ParentId=1 描述=Id1 的子级

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

4

2 回答 2

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
于 2013-02-13T18:38:38.760 回答
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);
于 2013-02-13T20:34:23.863 回答