如何通过 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
如果有多个匹配项,则抛出异常(这是 SingleOrDefault
与 FirstOrDefault
相比所做的)
如果没有与 Id 匹配的值,SingleOrDefault 将返回 null - 因此 null 合并将选择 int.MaxValue - 这意味着不匹配的值 - 或 numeric
为 null - 将被排序到末尾
如果存在与 Id 匹配的值,请从匹配的子 b
中选择 numeric
字段。
按所选值排序
【讨论】:
以上是关于如何通过 orderBy 对嵌套的 Linq 对象进行排序的主要内容,如果未能解决你的问题,请参考以下文章
如何通过两种不同类型的字段对 linq 查询结果进行排序 [重复]