You need to enable JavaScript to run this app. 如何使用AutoMapper将扁平模型映射到含字符串属性和IEnumerable<CustomClass>的类
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 11:27:02