1

ご覧のとおり、自己参照カテゴリ テーブルがあります。
代替テキスト

このテーブルを解析して、各カテゴリのツリー レベルを調べたいと思います。たとえば、ルート ノード レベルが 0 の場合、CPU とハード ドライブ、VGA と RAM はレベル 1 になります。どうすればそれを処理できますか?
各カテゴリ ID とそのレベルを配置する辞書を作成しました。

Dictionary<int, int> dic = new Dictionary<int, int>();

Key は CategoryId で、Value は Level です。辞書を埋める方法を教えてください。

4

3 に答える 3

2

これを 1 つの LINQ クエリで簡単に行うことはできません。再帰を使用する必要があります。C# で再帰関数を記述するか、データベースで再帰 CTE を使用します。

C# ソリューションの場合:

IEnumerable<KeyValuePair<int, int>> GetChildren(int id, int childLevel)
{
    foreach (var row in rows.Where(row => row.ParentID == id && row.ID != id))
    {
        yield return new KeyValuePair<int, int>(row.ID, childLevel);
        foreach (var x in GetChildren(row.ID, childLevel + 1))
        {
            yield return x;
        }
    }
}

次のように呼び出します。

GetChildren(0, 0);
于 2010-10-29T18:15:12.967 に答える
1

withキーワードを使用して、再帰的な共通テーブル式を使用することをお勧めします。MSDNのこの記事と私自身の質問hereをご覧ください。

于 2010-10-29T18:14:31.730 に答える
0

以前の回答に同意します。ツリーレベルを取得する魔法のクエリを実行することはできません。このような階層は、多くの場合、親ポインターではなく、ネストされたセット構造でより適切に提供されます。

http://en.wikipedia.org/wiki/Nested_set_model

この記事では、ネストされたセット データを操作するための一般的なクエリをいくつか紹介します。

http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/

于 2010-10-29T20:32:47.460 に答える