如您所见,我有一个自引用类别表:
我想解析这个表来找出每个类别的树级别。例如,如果根节点级别为 0,则 CPU 和硬盘驱动器以及 VGA 和 RAM 处于级别 1,依此类推。我该如何处理?
我创建了一个字典来放置每个类别 ID 及其级别:
Dictionary<int, int> dic = new Dictionary<int, int>();
键是 CategoryId,值是 Level。请帮助我如何填写字典?
如您所见,我有一个自引用类别表:
我想解析这个表来找出每个类别的树级别。例如,如果根节点级别为 0,则 CPU 和硬盘驱动器以及 VGA 和 RAM 处于级别 1,依此类推。我该如何处理?
我创建了一个字典来放置每个类别 ID 及其级别:
Dictionary<int, int> dic = new Dictionary<int, int>();
键是 CategoryId,值是 Level。请帮助我如何填写字典?
您不能在单个 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);
我同意前面的回答;你不能做一个神奇的查询来给你树级别。像这样的层次结构通常最好使用嵌套的集合结构而不是父指针:
http://en.wikipedia.org/wiki/Nested_set_model
本文向您展示了一些用于处理嵌套集数据的常见查询:
http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/