我有如下表结构。

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/

10-10 18:14