如何通过 orderBy 对嵌套的 Linq 对象进行排序

Posted

技术标签:

【中文标题】如何通过 orderBy 对嵌套的 Linq 对象进行排序【英文标题】:How to order a nested Linq object via orderBy 【发布时间】:2021-10-03 13:49:55 【问题描述】:

所以我想订购一个嵌套对象, 这个“someObject”对象在其内部具有“Values”对象。 如何通过 orderBy 对这个嵌套对象进行排序。

mySendendId=11

someObject=
Id=1
Values===
          Id=10     numeric =20     text=null
          Id=11     numeric =1.4    text=null
          Id=12     numeric =32     text=null
          Id=13     numeric=null    text=”abcde”

Id=2
Values===
          Id=10     numeric =21     text=null
          Id=11     numeric =1.2    text=null
          Id=12     numeric =33     text=null
          Id=13     numeric=null    text=”bcde”

Id=3
Values===
          Id=10     numeric =22     text=null
          Id=11     numeric =1.3    text=null
          Id=12     numeric =34     text=null
          Id=13     numeric=null    text=”cde”

someObject =1,2,3

orderedObject = someObject.orderBy(a=>a.Values.(b=>b.numeric).Where(b=>b.Id= =mySendendId))

orderedObject =2,3,1

我已经试过了

orderedObject= someObject.OrderBy(a => a.Id).Where(a => a.Values.OrderBy(b => b.Numeric).Any(b => b.Id == mySenedId));

但我只是返回了没有排序的原始对象。

【问题讨论】:

我是否正确理解您希望通过匹配“mySendendId”的子 ID 的“数字”字段来排序您的根 ID? 另外,minimal reproducible sample 会有所帮助。 mySendedId 是 values.ID 的值,如果 mySendedId 和 values.ID 相等,则使用 values.numeric 对 someObject 进行排序 【参考方案1】:

如果我理解正确,这应该可以满足您的要求:

orderedObject= someObject.OrderBy(a => a.Values.SingleOrDefault(b => b.Id == mySenedId)?.numeric ?? int.MaxValue);

由于没有样品可以试用,我希望我的理论设计正确。

应该遵循这个逻辑:

someObject 中的每个对象a 获取Values 并找到具有匹配ID 的值b 如果有多个匹配项,则抛出异常(这是 SingleOrDefaultFirstOrDefault 相比所做的) 如果没有与 Id 匹配的值,SingleOrDefault 将返回 null - 因此 null 合并将选择 int.MaxValue - 这意味着不匹配的值 - 或 numeric 为 null - 将被排序到末尾 如果存在与 Id 匹配的值,请从匹配的子 b 中选择 numeric 字段。 按所选值排序

【讨论】:

以上是关于如何通过 orderBy 对嵌套的 Linq 对象进行排序的主要内容,如果未能解决你的问题,请参考以下文章

如何通过两种不同类型的字段对 linq 查询结果进行排序 [重复]

如何使用 linq 表达式展平嵌套对象

如何使用 linq 表达式展平嵌套对象

如何使用 linq 查询具有嵌套列表的对象?

通过 ASP.NET MVC 在 C# 视图中遍历匿名对象的嵌套 LINQ 查询

如何使用 LINQ 使用嵌套属性对列表进行排序