如何使用AutoMapper将扁平模型映射到含字符串属性和IEnumerable<CustomClass>的类
AutoMapper扁平模型映射到嵌套集合DTO解决方案
你的需求本质是先将同源DirectionModel按DirectionId分组,再将每组内的经纬度属性映射为CoordinateDto集合,最终生成DirectionDto集合,可按以下步骤实现:
步骤1:配置AutoMapper映射规则
继承Profile类配置映射关系:
public class MappingProfile : Profile { public MappingProfile() { // 配置单个DirectionModel到CoordinateDto的映射,字段名完全匹配无需额外配置 CreateMap<DirectionModel, CoordinateDto>(); // 核心配置:将按DirectionId分组后的分组对象映射到DirectionDto CreateMap<IGrouping<string, DirectionModel>, DirectionDto>() // 分组键对应DirectionId .ForMember(dest => dest.DirectionId, opt => opt.MapFrom(src => src.Key)) // 分组内的所有元素映射为CoordinateDto集合 .ForMember(dest => dest.Coordinates, opt => opt.MapFrom(src => src.ToList())); } }
步骤2:注册AutoMapper服务
以ASP.NET Core环境为例,在Program.cs中添加如下代码注册映射配置:
builder.Services.AddAutoMapper(typeof(MappingProfile));
如果是控制台应用,可手动构造Mapper实例:
var configuration = new MapperConfiguration(cfg => cfg.AddProfile<MappingProfile>()); var mapper = configuration.CreateMapper();
步骤3:执行映射
对输入数据先按DirectionId分组,再调用映射接口即可得到目标结果:
// 样例输入数据 IEnumerable<DirectionModel> sourceData = new List<DirectionModel>() { new DirectionModel() {DirectionId="id1", Longitude=1, Latitude=2}, new DirectionModel() {DirectionId="id1", Longitude=3, Latitude=4}, new DirectionModel() {DirectionId="id2", Longitude=5, Latitude=6} }; // 先分组再映射 IEnumerable<DirectionDto> result = mapper.Map<IEnumerable<DirectionDto>>(sourceData.GroupBy(m => m.DirectionId));
执行完成后得到的result完全匹配你给出的期望输出格式。
内容的提问来源于stack exchange,提问作者Byron Scott
相关产品推荐
相关产品推荐

