我有如下表结构。
Id |ParentId| Name
--- |--------|-------
1 |NULL |A
2 |1 |B
3 |2 |C
4 |3 |D
A是B的父,B是C的父,C是D的父。
我想计算 parent 每条记录有多少?
例如,B 指的是 A,C 指的是 B,D 指的是 C。
在这种情况下,A 的深度级别为 0,B 为 1,C 为 2,D 为 3,基于它们拥有的父级数量。
我可以使用递归函数来做到这一点,每次查询记录是否有任何父项。我想以一种有效的方式使用 linq 查询来实现这一点。
最佳答案
我认为在不过度计算、多个请求或临时 sql 表的情况下实现这一目标的最佳方法是在 Dictionary
中一次选择所有表并在 C# 端计算父计数。
如果您可以接受,可以使用此函数和加法类来防止过度计算:
public class ParentInfo
{
public int? ParentId { get; }
public int? ParentCount { get; set; }
public ParentInfo(int? parentId)
{
ParentId = parentId;
}
}
private static int GetParentCount(int id, IDictionary<int, ParentInfo> conections)
{
if (!conections.ContainsKey(id))
throw new InvalidDataException($"Id = {id} not found in connections");
var info = conections[id];
if (info.ParentCount.HasValue) return info.ParentCount.Value;
var result = 0;
if (info.ParentId.HasValue) result += 1 + GetParentCount(info.ParentId.Value, conections);
info.ParentCount = result;
return result;
}
然后您可以使用此代码获得结果:
var conections = table.ToDictionary(r => r.Id, r => new ParentInfo(r.ParentId));
var result = conections.Select(c => new
{
Id = c.Key,
ParentCount = GetParentCount(c.Key, conections)
}).ToArray();
关于linq - 在父子层次结构中查找深度级别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39788654/