анализ иерархической таблицы самосоединения по уровню дерева?

Как видите, у меня есть справочная таблица категорий:
alt text

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

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

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


person Mehdi    schedule 29.10.2010    source источник
comment
Если вы используете SQL 2008, вы можете изменить саморегулирующуюся таблицу, чтобы использовать новый тип данных HierarchyID, который идеально подходит для подобных иерархий. В противном случае вам нужно будет использовать CTE, как сказал CesarGon ... если вы не хотите выполнять синтаксический анализ в коде C #.   -  person Dismissile    schedule 29.10.2010


Ответы (3)


Вы не можете сделать это легко в одном запросе 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);
person Mark Byers    schedule 29.10.2010

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

person CesarGon    schedule 29.10.2010

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

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

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

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

person FMM    schedule 29.10.2010