You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AutoMapper将源列表映射为目标数组 无需自定义foreach循环方案咨询

完全可以不用手动编写循环,AutoMapper原生支持集合、数组类型的自动映射,只需要补充基础类型的映射规则即可,具体实现如下:

最简实现(无需给Route的RouteId字段赋值)

只需要新增Trip到Route的映射规则,AutoMapper会自动完成集合到数组的转换:

var config = new MapperConfiguration(cfg =>
{
    cfg.AllowNullDestinationValues = true;
    // 补充Trip到Route的基础映射规则
    cfg.CreateMap<Trip, Route>()
        .ForMember(dest => dest.SequNumber, o => o.MapFrom(src => src.TrainNumber));

    cfg.CreateMap<ReservationSource, ReservationDestination>()
        .ForMember(dest => dest.SeqNumber, o => o.MapFrom(src => src.SeqNo))
        // 直接指定Trips为映射源,AutoMapper会自动遍历映射为Route数组
        .ForMember(dest => dest.TravelDest, o => o.MapFrom(src => src.TravelSource.Trips));
});

扩展实现(需要给Route的RouteId赋值TravelId)

如果需要将Travel类的TravelId赋值给每个Route的RouteId字段,可以通过AutoMapper的上下文传递参数:

var config = new MapperConfiguration(cfg =>
{
    cfg.AllowNullDestinationValues = true;
    cfg.CreateMap<Trip, Route>()
        .ForMember(dest => dest.SequNumber, o => o.MapFrom(src => src.TrainNumber))
        // 从上下文中取TravelId赋值给RouteId
        .ForMember(dest => dest.RouteId, o => o.MapFrom((src, dest, destMember, context) => context.Items[nameof(Travel.TravelId)]?.ToString()));

    cfg.CreateMap<ReservationSource, ReservationDestination>()
        .ForMember(dest => dest.SeqNumber, o => o.MapFrom(src => src.SeqNo))
        .ForMember(dest => dest.TravelDest, o => o.MapFrom((src, dest, destMember, context) => 
        {
            // 将TravelId存入映射上下文
            context.Items[nameof(Travel.TravelId)] = src.TravelSource.TravelId;
            return src.TravelSource.Trips;
        }));
});

以上方案完全替代自定义GetRoutes方法和手动循环逻辑,后续如果字段有调整,只需要修改Trip到Route的映射规则即可,无需修改集合转换逻辑,且自动兼容空值场景,和你现有AllowNullDestinationValues配置适配。

内容的提问来源于stack exchange,提问作者User1 Bas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 08:24:03