Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将层次结构循环到根目录_C#_Linq_Sql Server 2008 - Fatal编程技术网

C# 将层次结构循环到根目录

C# 将层次结构循环到根目录,c#,linq,sql-server-2008,C#,Linq,Sql Server 2008,我需要将层次结构循环到根。 这是我的表列 身份证 父ID 描述 我想你理解这个问题。ParentId为NULL的项是根 范例 Id=1 ParentId=NULL Descripion=Root Id=2 ParentId=1 Descripion=Id1的子项 这可以用linq实现吗?或者更好的sql查询。在sql Server上类似这样的解决方案可能是: 4示例如果我们想递归地找到Child1的根,我们可以使用 WITH n(ID, Description) AS (SELECT

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

  • 身份证
  • 父ID
  • 描述
  • 我想你理解这个问题。ParentId为NULL的项是根

    范例

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

    这可以用linq实现吗?或者更好的sql查询。

    在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
    
    看一看关键字为

    Oracle server上将使用相同的解决方案

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

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

        class Node
        {
            public Guid Id { get; set; }
            public IEnumerable<Node> Children { get; set; }
            public string Description { get; set; }
        }
    
        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;
                    }
                }
            }
        }
    
        var descriptions = MyTreeStructure.FlattenedTree(x => x.Children).Select(x => x.Description);
    

    您是说要返回特定项的整个层次结构吗?