LINQ查询求助:提取Parts类Data字典Number键值并按Id分组
正确提取并分组Parts数据的LINQ解决方案
看起来你的LINQ代码逻辑有点混乱,不仅编译会出错,也没实现按Parts.Id分组并提取Number键值对的需求。我来帮你整理出正确的实现方式:
需求回顾
我们需要从People.Parts集合中:
- 提取每个
Parts对象里Data字典中包含"Number"(兼容大小写,比如示例里的小写"number")的键值对 - 按
Parts.Id进行分组 - 最终得到包含
Parts.Id、Number键及其对应值的结果
完整LINQ解决方案
考虑到鲁棒性(比如兼容大小写、处理Data中可能有多个类似Number的键),可以用以下代码:
using System.Linq; using System; // 假设msf是已初始化的People实例 var result = msf.Parts // 先为每个Parts提取Id和符合条件的Number键值对 .Select(part => new { PartId = part.Id, NumberItems = part.Data // 筛选键包含"Number"的条目,忽略大小写 .Where(kv => kv.Key.IndexOf("Number", StringComparison.OrdinalIgnoreCase) >= 0) .Select(kv => new { Key = kv.Key, Value = kv.Value }) .ToList() }) // 按Parts的Id分组 .GroupBy(item => item.PartId) // 转换为最终的结果结构 .Select(group => new { PartId = group.Key, NumberEntries = group.SelectMany(g => g.NumberItems).ToList() }) .ToList();
简化版(如果满足特定前提)
如果你的业务能保证:
- 每个
Parts的Data字典一定存在包含"Number"的键(大小写任意) - 每个
Parts的Id是唯一的,不需要分组合并
可以用更简洁的代码:
var simplifiedResult = msf.Parts .Select(part => new { PartId = part.Id, NumberValue = part.Data .First(kv => kv.Key.IndexOf("Number", StringComparison.OrdinalIgnoreCase) >= 0) .Value }) .ToList();
原代码的问题分析
你原来的代码有两个核心问题:
- 编译错误:第一个
Select里的s是Data.Keys筛选后的字符串键,它没有Value属性,所以.Select(s => s.Value)会报错 - 逻辑缺失:没有关联
Parts.Id,也没有实现按Id分组的逻辑,完全偏离了需求
示例数据对应的结果
针对你提供的JSON示例,简化版代码会返回如下结构的列表:
[ { "PartId": "234567", "NumberValue": "1" }, { "PartId": "3424242", "NumberValue": "2" } ]
内容的提问来源于stack exchange,提问作者Radost
相关产品推荐
相关产品推荐

