Разбор иерархической таблицы самоподключения по уровням дерева? - PullRequest
1 голос
/ 29 октября 2010

У меня есть таблица ссылок на себя, как вы видите:
alt text

Я хочу проанализировать эту таблицу, чтобы узнать уровень дерева для каждой категории. например, если уровень корневого узла равен 0, тогда ЦП и жесткий диск, VGA и ОЗУ находятся на уровне 1 и так далее. как я могу справиться с этим?
Я создал словарь, в который нужно добавить идентификатор каждой категории и ее уровень:

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

Ключ - CategoryId, а Значение - Уровень. Пожалуйста, помогите мне, как я могу заполнить словарь?

Ответы [ 3 ]

2 голосов
/ 29 октября 2010

Вы не можете сделать это легко в одном запросе 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);
1 голос
/ 29 октября 2010

Я предлагаю вам использовать рекурсивное общее табличное выражение, используя ключевое слово с .Посмотрите эту статью на MSDN и мой собственный вопрос здесь .

0 голосов
/ 30 октября 2010

согласен с предыдущими ответами;Вы не можете сделать магический запрос, который даст вам уровень дерева.Подобные иерархии часто лучше обслуживать с помощью структуры вложенного набора, а не родительского указателя:

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

В этой статье показаны некоторые общие запросы для работы с данными вложенного набора:

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

...