【问题标题】:AutoMapper different levelAutoMapper 不同级别
【发布时间】:2020-07-02 08:14:18
【问题描述】:

尝试从 Customer 映射到 CustomerDto,但在源中的那个额外层存在问题(我无法控制源,因此很遗憾无法将两者对齐)。

public class Customer
{
    public string Name { get; set; }
    public AddressSet AddressSet { get; set; }
}

public class AddressSet
{
    public AddressSetResults[] AddressSetResults { get; set; }    
}

public class AddressSetResults
{
    public string Street { get; set; }
    public string HouseNumber { get; set; }
}

public class CustomerDto
{
    public string Name { get; set; }
    public AddressDto AddressDto { get; set; }
}

public class AddressDto
{
    public string Street { get; set; }
    public string HouseNumber { get; set; }
}

以下不适用于 AddressDto,知道我缺少什么吗?

CreateMap<Customer, CustomerDto>()
 .ForMember(dest => dest.AddressDto , opt => opt.MapFrom(src => src.AddressSet.AddressSetResults))

【问题讨论】:

    标签: automapper


    【解决方案1】:

    两件事:

    1) 缺少从 AddressSetResults 到 AddressDto 的映射

    为了映射内部地址,您还需要为这些内部类型创建映射:

    CreateMap<AddressSetResults, AddressDto>();
    

    2) 从 AddressSetResults 数组的元素映射,而不是从数组本身映射

    这个方法:

    .ForMember(
        dest => dest.AddressDto, 
        opt => opt.MapFrom(src => src.AddressSet.AddressSetResults))
    

    告诉 AutoMapper 从AddressSetResults 映射到AddressDtoAddressSetResults 是一个数组。这是不正确的,因为 AutoMapper 不知道如何从元素数组映射到一个元素。除非您也为此创建地图,否则这不是一个好的解决方案。

    假设AddressSetResults 最多包含一个地址,您可以解决在映射表达式末尾再添加一个调用FirstOrDefault() 的问题:

    .ForMember(
        dest => dest.AddressDto, 
        opt => opt.MapFrom(src => src.AddressSet.AddressSetResults.FirstOrDefault()))
    

    FirstOrDefault() 需要 System.Linq 命名空间。

    为什么不只是First()?如果源AddressSetResults 数组不包含任何元素,则映射将失败并导致异常,因为找不到满足First() 方法调用的元素。使用FirstOrDefault() 使其抵抗无元素场景是更安全的解决方案。


    最终的工作配置:

    CreateMap<Customer, CustomerDto>()
        .ForMember(
            dest => dest.AddressDto,
            opt => opt.MapFrom(src => src.AddressSet.AddressSetResults.FirstOrDefault()));
    CreateMap<AddressSetResults, AddressDto>();
    

    【讨论】:

      猜你喜欢
      • 2016-03-04
      • 1970-01-01
      • 2016-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-24
      • 2014-12-01
      • 1970-01-01
      相关资源
      最近更新 更多