c# - 如何使用 LINQ 按深度级别对对象层次结构进行排序?

标签 c# linq sorting hierarchy hierarchical-data

考虑这个层次结构

                     A
                     |
        --------------------------
        |                        |
        B                        C
        |                        |
--------|--------            ---------
|       |       |            |       |
D       E       F            G       H
|       |                    |       |
|   ---------             -------    |
|   |       |             |     |    |
I   J       K             L     M    N

每个对象都有一个 Parent 属性和一个用于子项的 Items 集合,因此例如,E 有 B 的父级,H 的 N 等。A 的父级值为 null。 B.Items包含D-F等

什么是 LINQ 语句,我可以按级别对它们进行排序?我不关心级别内的排序顺序(即 D-H 的顺序无关紧要,但它们必须在 B 之后,C 必须在 A 之后。

我能想到的唯一方法是两个单独的 linq 语句:

  1. 对此进行聚合,计算并存储级别
  2. 对按级别排序的结果运行第二个 LINQ 查询。

B当然很简单。这是我正在努力的A。我当然可以在程序上做到这一点,但我必须认为这可以简化为 LINQ 语句。

最佳答案

您没有指定查询的目标,因此有多个正确答案:

  1. LINQ to SQL 或 LINQ to Entities - 不支持递归查询,因此您要么必须将数据加载到内存中并执行 LINQ to Objects 查询,要么在数据库中使用存储过程(很可能使用公用表表达式)。您还可以在数据库中准备一个 VIEW 并将其映射到您的 EF 模型。

  2. LINQ to Objects 更适合这项工作,但在我看来,您仍然最好使用计算深度的简单方法:

    public static int GetDepth(Item item)
    {
        int d = 0;
        while ((item = item.Parent) != null)
            d++;
        return d;
    }
    

    而且后面的查询 super 简单

    var results = from item in data
                  let depth = GetDepth(item)
                  orderby depth descending
                  select item;
    

    如果您的数据结构不同,并且 Parent 具有指向所有子项的链接,则只编写一个 LINQ to Objects 查询会很容易。在这种情况下,查询数据会更容易,因为每个项目都有一个依赖项目的集合,并且 LINQ 可以很好地处理集合,而不是单个项目,例如您的 Parent 属性。我写了一篇关于 querying hierarchy of objects using LINQ 的博文前阵子,你可能会觉得很有趣。

关于c# - 如何使用 LINQ 按深度级别对对象层次结构进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31802493/

相关文章:

c# - Python 中 C# 的 GetEncoding ("28591") 相当于什么?

c# - 有哪些最佳实践可确保您的 .NET 代码能够很好地扩展?

c# - 从子类中替换父类

c# - WPF 在代码中动态设置 CommandParameter 上的绑定(bind)

c# - 在 .Where() 内嵌套 .Select()

c++ - 排序 vector 对

linq - 如何对带有子属性的集合进行排序?

c# - ICollection<T> 上的 ElementAt(index)

java - 如何在排序结束时始终有空值

javascript - 如何在javascript中对混合数字/字母数字数组进行排序