階層をルートまでループする必要があります。これが私のテーブル列です
- Id
- ParentId
- 説明
あなたは問題を理解していると思います。ParentIdNULLのアイテムがルートです。
例
- Id = 1 ParentId = NULL Descripion = Root
- Id = 2 ParentId = 1 Descripion=Id1の子
これはlinqを使用して実行できますか?または、SQLクエリを使用するとさらに効果的です。
階層をルートまでループする必要があります。これが私のテーブル列です
あなたは問題を理解していると思います。ParentIdNULLのアイテムがルートです。
例
これは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
MSDN4WITHキーワードを見てください
Oracleサーバー上の同じソリューションが使用されます
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; }
}
次に、次のような拡張子を持つ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);