如何使用C# LINQ实现多分类标签实体的分类-关联实体映射
使用C# LINQ实现分类与实体的关联映射
前提修正
首先注意原Entity类定义中的笔误:Entity Name会导致递归引用错误,应该改为string Name,修正后的类定义如下:
public class Entity { public string Name { get; set; } public List<Category> Categories { get; set; } } public class Category { public string Name { get; set; } // 可根据业务需求添加其他属性 }
LINQ实现方案
通过SelectMany展开实体与分类的关联关系,再结合GroupBy和ToDictionary/Select即可实现需求:
方案1:转换为字典(键为分类名,值为实体名拼接字符串)
var categoryEntityMap = listentities // 展开每个实体的所有分类,与实体名形成一对一的映射 .SelectMany(entity => entity.Categories.Select(cat => new { CategoryName = cat.Name, EntityName = entity.Name })) // 按分类名分组 .GroupBy(item => item.CategoryName) // 转换为字典,同时将每组的实体名用逗号拼接 .ToDictionary( group => group.Key, group => string.Join(", ", group.Select(item => item.EntityName)) );
方案2:转换为实体列表(便于生成表格或后续处理)
如果需要得到类似期望表格的结构化数据,可改用Select生成自定义对象:
var categoryEntityList = listentities .SelectMany(entity => entity.Categories.Select(cat => new { CategoryName = cat.Name, EntityName = entity.Name })) .GroupBy(item => item.CategoryName) .Select(group => new { Category = group.Key, Entities = string.Join(", ", group.Select(item => item.EntityName)) }) .ToList();
代码说明
- SelectMany:将每个实体的
Categories集合展开,把每个分类与所属实体的名称绑定,形成一个扁平的<分类名, 实体名>集合。 - GroupBy:以分类名为键,将所有关联的实体名聚合到同一分组下。
- ToDictionary/Select:将分组结果转换为目标格式,用
string.Join把实体名拼接成逗号分隔的字符串,与期望输出一致。
内容的提问来源于stack exchange,提问作者cshaprcoder101
相关产品推荐
相关产品推荐

