AutoMapper - 将平面对象列表映射到复杂对象

问题描述 投票:0回答:1

我在 .NET 6 应用程序中使用 AutoMapper 将多个记录从源列表映射到目标对象中的列表属性。

源对象:

public class UserDetailDto
{
    public string ID { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Address1 { get; set; }
    public string Address2 { get; set; }
}

目标对象:

public class UserDetail
{
    public string ID { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public List<UserAddress> Addresses { get; set; }
}

public class UserAddress
{
    public string Address1 { get; set; }
    public string Address2 { get; set; }
}

AutoMapper 映射:

CreateMap<UserDetailDto, UserDetail>()
    .ForMember(dest => dest.ID, src => src.MapFrom(_ => _.ID))
    .ForMember(dest => dest.FirstName, src => src.MapFrom(_ => _.FirstName))
    .ForMember(dest => dest.LastName, src => src.MapFrom(_ => _.LastName));

在上面,一个用户可以有多个地址。因此,从数据库中,将有多个具有不同 Address1 和 Address2 但具有相同 ID、FirstName 和 LastName 的用户记录。

因此,我需要以这样的方式为用户进行映射,尽管可能有多个记录,但映射后它应该有一个带有其地址列表的记录。

我不确定如何实现甚至支持这一点。非常感谢任何帮助。

automapper .net-6.0
1个回答
0
投票

您可以实现从

IEnumerable<UserDetailDto>
到单个
UserDetail
的自定义类型转换器映射。

public class UserDetailDtoListToUserDetailConverter : ITypeConverter<IEnumerable<UserDetailDto>, UserDetail>
{
    public UserDetail Convert(IEnumerable<UserDetailDto> source, UserDetail destination, ResolutionContext context)
    {
          destination = context.Mapper.Map<UserDetail>(source.First());
          destination.Addresses = context.Mapper.Map<List<UserAddress>>(source);
          
          return destination;
    }
}

对于您的映射规则,

CreateMap<UserDetailDto, UserDetail>();
            
CreateMap<UserDetailDto, UserAddress>();
        
CreateMap<IEnumerable<UserDetailDto>, UserDetail>()
    .ConvertUsing<UserDetailDtoListToUserDetailConverter>();

注意,默认情况下,AutoMapper 会自动从源对象映射到具有相同成员名称的目标对象,因此您无需指定具有相同名称的成员映射。

© www.soinside.com 2019 - 2024. All rights reserved.