如何在LINQ中按多字段分组并嵌套其余差异字段?
解决LINQ按多字段分组并嵌套其余字段的问题
你的问题核心在于只按单个字段分组,而没有把ITEM_NAME和对应的描述字段(比如你示例里的item1,假设实体类里叫ItemDescription)一起作为分组依据。我们需要调整分组键,同时构造嵌套结构来存储每组的其他字段。
原代码的问题
你之前的代码:
Itm.GroupBy(x => x.ITEM_NAME).Select(x => x.ToList()).ToList();
仅以ITEM_NAME作为分组键,所以只要ITEM_NAME相同就会被分到一组,无法区分同一ITEM_NAME下不同描述的记录,自然达不到你想要的合并效果。
正确实现步骤
假设你的实体类结构大致如下(根据你的示例调整字段名,替换成你实际的字段即可):
public class Item { public string ITEM_NAME { get; set; } // 对应sample1 public string ItemDescription { get; set; } // 对应item1 public string Rule { get; set; } // 对应Rule2、test1 public string RuleMsg { get; set; } // 对应Rule2msg、testrule public string ItemInfo { get; set; } // 对应iteminfo2、iteminfo1 }
1. 按多字段分组
使用匿名类型作为分组键,因为匿名类型会自动根据属性值生成Equals和GetHashCode方法,能正确识别ITEM_NAME和描述都相同的记录:
var groupedItems = Itm .GroupBy(item => new { item.ITEM_NAME, item.ItemDescription }) .Select(group => new { // 提取分组的两个键 SampleName = group.Key.ITEM_NAME, ItemName = group.Key.ItemDescription, // 嵌套存储每组的其余字段 Details = group.Select(item => new { Rule = item.Rule, RuleMsg = item.RuleMsg, ItemInfo = item.ItemInfo }).ToList() }) .ToList();
2. 强类型输出(可选)
如果需要强类型的结果而非匿名类型,可以定义DTO类来存储分组后的数据:
// 定义分组后的结构 public class GroupedItem { public string SampleName { get; set; } public string ItemName { get; set; } public List<ItemDetail> Details { get; set; } } // 定义嵌套的详情结构 public class ItemDetail { public string Rule { get; set; } public string RuleMsg { get; set; } public string ItemInfo { get; set; } } // 调整LINQ查询 var groupedItems = Itm .GroupBy(item => new { item.ITEM_NAME, item.ItemDescription }) .Select(group => new GroupedItem { SampleName = group.Key.ITEM_NAME, ItemName = group.Key.ItemDescription, Details = group.Select(item => new ItemDetail { Rule = item.Rule, RuleMsg = item.RuleMsg, ItemInfo = item.ItemInfo }).ToList() }) .ToList();
最终效果
运行上述代码后,你会得到符合预期的结果:
- 每个条目对应一组
ITEM_NAME和描述都相同的记录 Details列表中包含该组内所有不同的其余字段组合,避免了ITEM_NAME和描述的重复
内容的提问来源于stack exchange,提问作者CodeDada
相关产品推荐
相关产品推荐

