1

如您所见,我有一个自引用类别表:
替代文字

我想解析这个表来找出每个类别的树级别。例如,如果根节点级别为 0,则 CPU 和硬盘驱动器以及 VGA 和 RAM 处于级别 1,依此类推。我该如何处理?
我创建了一个字典来放置每个类别 ID 及其级别:

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

键是 CategoryId,值是 Level。请帮助我如何填写字典?

4

3 回答 3

2

您不能在单个 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

我建议您使用带有关键字的递归公用表表达式。看看这篇关于 MSDN的文章和我自己的问题

于 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 回答