按树级解析分层自连接表?

时间:2010-10-29 18:10:57

标签: c# sql-server-2005 linq-to-sql hierarchical-data self-join

我有一个自我参照类别表,如你所见:
alt text

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

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

Key是CategoryId,Value是Level。 请帮帮我怎么填字典?

3 个答案:

答案 0 :(得分: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);

答案 1 :(得分:1)

我建议您使用with关键字使用递归公用表表达式。请查看this article on MSDN和我自己的问题here

答案 2 :(得分:0)

我同意以前的答案;你不能做一个神奇的查询,将给你树级。像这样的层次结构通常更好地使用嵌套集结构而不是父指针:

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

本文向您展示了使用嵌套集数据的一些常见查询:

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