考虑这个层次结构
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 语句:
- 对此进行聚合,计算并存储级别
- 对按级别排序的结果运行第二个 LINQ 查询。
B当然很简单。这是我正在努力的A。我当然可以在程序上做到这一点,但我必须认为这可以简化为 LINQ 语句。
最佳答案
您没有指定查询的目标,因此有多个正确答案:
LINQ to SQL 或 LINQ to Entities - 不支持递归查询,因此您要么必须将数据加载到内存中并执行 LINQ to Objects 查询,要么在数据库中使用存储过程(很可能使用公用表表达式)。您还可以在数据库中准备一个 VIEW 并将其映射到您的 EF 模型。
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/