在C#中使用AutoMapper映射多层嵌套子对象拼接属性至DTO
EF Core 集成 AutoMapper 时的嵌套属性映射问题
实体与DTO定义
public class Request { public int RequestID { get; set; } // 省略其他属性 public virtual ICollection<RequestApplication> RequestApplications { get; set; } } public class RequestApplication { // 省略其他属性 public virtual Application Application { get; set; } } public class Application { public string Name { get; set; } } public class ManagedRequestsDTO { public int RequestID { get; set; } // 省略其他属性 public string Systems { get; set; } }
需求说明
需要将Request对象中嵌套的所有Application.Name属性值拼接为空格分隔的字符串,赋值给ManagedRequestsDTO的Systems字段。例如针对以下数据:
{ "RequestID": "5", "RequestApplications": [ { "Application": { "Name": "Apple" } }, { "Application": { "Name": "Pear" } } ] }
期望ManagedRequestsDTO.Systems的值为"Apple Pear"。
当前已配置的AutoMapper映射:
CreateMap<Request, ManageRequestDTO>() .ForMember(dest => dest.RequestID, opt => opt.MapFrom(src => src.RequestID));
解决方案
在现有映射配置中添加Systems字段的自定义映射逻辑即可,通过LINQ提取名称并拼接:
CreateMap<Request, ManagedRequestsDTO>() .ForMember(dest => dest.RequestID, opt => opt.MapFrom(src => src.RequestID)) .ForMember(dest => dest.Systems, opt => opt.MapFrom(src => src.RequestApplications != null ? string.Join(" ", src.RequestApplications .Select(ra => ra.Application?.Name) .Where(name => !string.IsNullOrEmpty(name))) : string.Empty ));
关键细节说明
- 先判断
RequestApplications是否为null,避免空引用异常 - 使用
ra.Application?.Name的空条件运算符,防止Application为null时抛出异常 - 通过
Where过滤掉空或空白的名称,避免拼接出多余空格 - 最后用
string.Join(" ", ...)将有效名称用空格拼接成完整字符串
内容的提问来源于stack exchange,提问作者CrystalBlue
相关产品推荐
相关产品推荐

