automapper - выравнивание свойств списка для отдельных отдельных свойств - PullRequest
0 голосов
/ 14 июня 2019

У меня есть класс назначения, который выглядит так:

public class CustomerAddressSummary
{   
    public string StateTxt { get; set; }

    public string AddrLn1 { get; set; }
    public string AddrLn2 { get; set; }

    public string Phn { get; set; }
    public string HomePhnNbr { get; set; }
    public string MobilePhnNbr { get; set; }
    public string WorkPhnNbr { get; set; }
    public string EmailAddr { get; set; }
}

И исходный класс:

public class CustomerAddressSummaryObj
{
    public ADDRESS Address { get; set; }
    public List<COMMUNICATION> Communications { get; set; }        
    public string StateTxt { get; set; }
}

Вот отображение:

CreateMap<CustomerAddressSummaryObj, CustomerAddressSummary>()
    .ForMember(dest => dest.StateTxt, opt => opt.MapFrom(src => src.StateTxt))  
    .ForMember(dest => dest.AddrLn1, opt => opt.MapFrom(src => src.Address.ADDRLN1))
    .ForMember(dest => dest.AddrLn2, opt => opt.MapFrom(src => src.Address.ADDRLN2));

CreateMap<COMMUNICATION, CustomerAddressSummary>()
    .ForMember(dest => dest.Phn,
        opt => opt.MapFrom(src => src.TYPECD == Constant.CommunicationTypeCode.Main ? src.DETAILS : null))
    .ForMember(dest => dest.EmailAddr,
        opt => opt.MapFrom(src => src.TYPECD == Constant.CommunicationTypeCode.Email ? src.DETAILS : null))
    .ForMember(dest => dest.HomePhnNbr,
        opt => opt.MapFrom(src => src.TYPECD == Constant.CommunicationTypeCode.Home ? src.DETAILS : null))
    .ForMember(dest => dest.MobilePhnNbr,
        opt => opt.MapFrom(src => src.TYPECD == Constant.CommunicationTypeCode.Mobile ? src.DETAILS : null))
    .ForMember(dest => dest.WorkPhnNbr,
        opt => opt.MapFrom(src => src.TYPECD == Constant.CommunicationTypeCode.Work ? src.DETAILS : null));

Реализация:

var customerAddress = _mapper.Map<CustomerAddressSummary>(customerAddressSummaryObj);

Заполняет всю информацию, кроме COMMUNICATION. Поэтому я попробовал что-то вроде этого:

var customerAddress = _mapper.Map<CustomerAddressSummary>(customerAddressSummaryObj)
    .Map(customerAddressSummaryObj.Communications,_mapper);

public static TDestination Map<TSource, TDestination>(this TDestination destination, TSource source, IMapper mapper)
{
    return source == null ? destination : mapper.Map(source, destination);
}

Но это также не работает и создает исключение. Есть идеи, что мне здесь не хватает?

1 Ответ

0 голосов
/ 14 июня 2019

Я смог решить, используя Linq

CreateMap<CustomerAddressSummaryObj, CustomerAddressSummary>()
   .ForMember(dest => dest.EmailAddr, opt => opt.MapFrom((src,dest) => src.Communications
                    .FirstOrDefault(x => x.TYPECD == Constant.CommunicationTypeCode.Email)?.DETAILS))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...