AutoMapper如何将对象列表映射为包含嵌套列表的单个对象
实现List到嵌套列表结构EventLog对象的AutoMapper映射方案
1. 配置映射规则
首先在AutoMapper的自定义Profile中添加两类映射配置:
- EventDTO到Event的基础映射:两个类字段名完全匹配,无需额外配置
- List
到EventLog的整体映射:取集合首元素的公共字段赋值给EventLog的顶层属性,集合整体映射为嵌套的Events列表
using AutoMapper; public class MappingProfile : Profile { public MappingProfile() { CreateMap<EventDTO, Event>(); CreateMap<List<EventDTO>, EventLog>() .ForMember(dest => dest.SystemId, opt => opt.MapFrom(src => src.First().SystemId)) .ForMember(dest => dest.UserId, opt => opt.MapFrom(src => src.First().UserId)) .ForMember(dest => dest.Events, opt => opt.MapFrom(src => src)); } }
2. 调用映射
完成Profile注册后,直接调用IMapper的Map方法即可完成转换:
// 示例源数据,所有元素SystemId、UserId一致 List<EventDTO> eventDtoList = GetYourDtoList(); // 转换为目标对象 EventLog result = _mapper.Map<EventLog>(eventDtoList);
可选优化
如果需要兼容空列表场景,避免空引用异常,可以修改映射配置的取值逻辑:
CreateMap<List<EventDTO>, EventLog>() .ForMember(dest => dest.SystemId, opt => opt.MapFrom(src => src.FirstOrDefault()?.SystemId ?? string.Empty)) .ForMember(dest => dest.UserId, opt => opt.MapFrom(src => src.FirstOrDefault()?.UserId ?? string.Empty)) .ForMember(dest => dest.Events, opt => opt.MapFrom(src => src ?? new List<EventDTO>()));
内容的提问来源于stack exchange,提问作者Rahul Bhosale
相关产品推荐
相关产品推荐

