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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 03:12:07