【问题标题】:parsing Hierarchical self-join table by tree level?按树级别解析分层自连接表?
【发布时间】:2010-10-30 04:32:47
【问题描述】:

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

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

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

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

【问题讨论】:

  • 如果您使用的是 SQL 2008,您可以更改自引用表以使用新的 HierarchyID 数据类型,该数据类型非常适合此类层次结构。否则,您将需要使用 CesarGon 所说的 CTE……除非您想在 C# 代码中进行解析。

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


【解决方案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);

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      我同意前面的回答;你不能做一个神奇的查询来给你树级别。像这样的层次结构通常最好使用嵌套的集合结构而不是父指针:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-16
        • 2012-08-03
        • 2014-12-23
        • 2019-05-22
        • 2023-03-29
        • 1970-01-01
        相关资源
        最近更新 更多