我在 .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 的用户记录。
因此,我需要以这样的方式为用户进行映射,尽管可能有多个记录,但映射后它应该有一个带有其地址列表的记录。
我不确定如何实现甚至支持这一点。非常感谢任何帮助。
您可以实现从
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 会自动从源对象映射到具有相同成员名称的目标对象,因此您无需指定具有相同名称的成员映射。