如何按嵌套Enumerable属性使用GroupBy分组Activity数据
按嵌套属性GroupBy分组问题
数据结构
public class Activity { public int Id { get; set; } public string Name { get; set; } public IEnumerable<Business> Businesses { get; set; } } public class Business { public int Id { get; set; } public string Name { get; set; } }
现有数据
- Activity 1
- Business A
- Business B
- Activity 2
- Business B
- Activity 3
- Business A
期望结果
- Business A
- Activity 1
- Activity 3
- Business B
- Activity 1
- Activity 2
问题
尝试了GroupBy与SelectMany/Select的多种组合,但始终无法正确实现分组映射。
解决方案
核心思路是先将Activity与对应的Business展开为一对多的关联项,再按Business分组,最后整理结构:
代码实现
// 假设activities是你的IEnumerable<Activity>数据源 var groupedResult = activities // 展开每个Activity和它的Business,生成(Activity, Business)的序列 .SelectMany(activity => activity.Businesses.Select(business => new { activity, business })) // 按Business分组(如果Business的相等性判断有问题,建议按Id分组) .GroupBy(item => item.business) // 整理成期望的结构:每个组包含Business和对应的Activity列表 .Select(group => new { Business = group.Key, Activities = group.Select(item => item.activity).ToList() }) .ToList();
注意事项
如果直接按Business对象分组时出现分组异常(比如同一个Business被分成多个组),说明Business类的相等性判断逻辑不符合预期,此时可以改为按Business.Id(唯一标识)分组,调整后的代码如下:
var groupedResult = activities .SelectMany(activity => activity.Businesses.Select(business => new { activity, business.Id, business.Name })) .GroupBy(item => new { item.Id, item.Name }) // 按Business的Id和Name分组,确保唯一性 .Select(group => new { Business = new Business { Id = group.Key.Id, Name = group.Key.Name }, Activities = group.Select(item => item.activity).ToList() }) .ToList();
内容的提问来源于stack exchange,提问作者trh88
相关产品推荐
相关产品推荐

