如何使用LINQ从嵌套列表结构中筛选匹配指定groupNumber且EffectiveDate最新的Result数据
如何使用LINQ从嵌套列表结构中筛选匹配指定groupNumber且EffectiveDate最新的Result数据
嗨,我看了你写的代码和需求,这里有几个小问题需要调整,我来一步步帮你搞定~
首先先说说你原代码里的问题:
- 第一个
Where的判断逻辑不对:x.aGroupRecord.Where(a => a.groupNumber == groupNumber)返回的是一个匹配的GroupRecord集合,而Where需要的是布尔值条件,所以应该用Any来检查当前Result的aGroupRecord列表里是否存在指定的groupNumber - 你嵌套的
OrderByDescending语法错误,而且逻辑上应该先筛选符合条件的Result,再对这些结果按EffectiveDate排序取最新的
接下来给你两种可行的写法,根据你的.NET版本来选:
方法1:.NET 6+ 版本(推荐,更简洁高效)
用MaxBy方法直接找出符合条件的结果中EffectiveDate最大的项:
string groupNumber = "SALT"; // 建议用await替代.Result,避免阻塞线程 Root dataObject = await response.Content.ReadAsAsync<Root>(); // 先筛选出包含指定groupNumber的Result,再取其中EffectiveDate最新的 var targetResult = dataObject.result .Where(r => r.aGroupRecord.Any(g => g.groupNumber == groupNumber)) .MaxBy(r => r.npi.EffectiveDate);
方法2:兼容.NET 5及以下版本
如果你的项目用的是旧版.NET,就用OrderByDescending加FirstOrDefault的组合:
string groupNumber = "SALT"; Root dataObject = await response.Content.ReadAsAsync<Root>(); var targetResult = dataObject.result .Where(r => r.aGroupRecord.Any(g => g.groupNumber == groupNumber)) .OrderByDescending(r => r.npi.EffectiveDate) .FirstOrDefault();
代码解释
- 筛选条件:
Where(r => r.aGroupRecord.Any(g => g.groupNumber == groupNumber))—— 只保留那些aGroupRecord列表里存在指定groupNumber的Result项 - 取最新日期:
.MaxBy(...):直接返回集合中指定属性值最大的元素(也就是最新的EffectiveDate).OrderByDescending(...).FirstOrDefault():把符合条件的结果按日期从新到旧排序,然后取第一个元素
另外提个小建议:尽量用await response.Content.ReadAsAsync<Root>()替代.Result,后者可能会导致线程阻塞甚至死锁的问题,尤其是在异步上下文里。
备注:内容来源于stack exchange,提问作者H22
相关产品推荐
相关产品推荐

