1

階層をルートまでループする必要があります。これが私のテーブル列です

  1. Id
  2. ParentId
  3. 説明

あなたは問題を理解していると思います。ParentIdNULLのアイテムがルートです。

  • Id = 1 ParentId = NULL Descripion = Root
  • Id = 2 ParentId = 1 Descripion=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

MSDN4WITHキーワードを見てください 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 に答える