【问题标题】:How to order a nested Linq object via orderBy如何通过 orderBy 对嵌套的 Linq 对象进行排序
【发布时间】: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 进行排序

标签: c# linq sorting nested nested-object


【解决方案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 字段。
  • 按所选值排序

【讨论】:

    猜你喜欢
    • 2019-05-13
    • 1970-01-01
    • 2020-06-29
    • 2011-07-01
    • 2015-03-31
    • 2019-06-25
    • 2021-09-19
    • 2012-04-04
    相关资源
    最近更新 更多