2016-11-03 3 views
0

У меня есть простой класс, называемый Поставщик, у которого есть контакты и контакты могут иметь адреса. прямо сейчас мы используем только один контакт и 1 адрес (строка1 - строка4) в этом контакте. В будущем мы можем использовать несколько контактов с несколькими адресами. Ниже мой классAutomapper лучший способ отображения свойства с пользовательской логикой

public class SupplierDto 
    { 

     public string Name { get; set; } 
     public string Alias { get; set; } 
     public int? SupplierTypeId { get; set; } 
     public int? WebclicsManufacturerId { get; set; } 
     public string SAPCode { get; set; } 

     public string Line1 { get; set; } 
     public string Line2 { get; set; } 

     public string Line3 { get; set; } 
     public string Line4 { get; set; } 
     public int CountryId { get; set; } 
     public string PostalCode { get; set; } 


     public string ContactName { get; set; } 
     public string ContactEmail { get; set; } 
     public string ContactTelephone { get; set; } 
     public string ContactJobTitle { get; set; } 
    } 

Мой класс Поставщик является немного сложным, так что я пытаюсь карта от поставщика к DTO и ниже мое отображение.

CreateMap<Supplier, SupplierDto>() 
       .ForMember(dest => dest.Line1, options => options.MapFrom(source => source.SupplierContacts.First().Contact.EntityAddresses.First().Address.Line1)) 
       .ForMember(dest => dest.Line2, options => options.MapFrom(source => source.SupplierContacts.First().Contact.EntityAddresses.First().Address.Line2)) 
       .ForMember(dest => dest.Line3, options => options.MapFrom(source => source.SupplierContacts.First().Contact.EntityAddresses.First().Address.Line3)) 
       .ForMember(dest => dest.Line4, options => options.MapFrom(source => source.SupplierContacts.First().Contact.EntityAddresses.First().Address.Line4)) 
       .ForMember(dest => dest.CountryId, options => options.MapFrom(source => source.SupplierContacts.First().Contact.EntityAddresses.First().Address.CountryId)) 
       .ForMember(dest => dest.PostalCode, options => options.MapFrom(source => source.SupplierContacts.First().Contact.EntityAddresses.First().Address.PostalCode)) 
       .ForMember(dest => dest.ContactName, options => options.MapFrom(source => source.SupplierContacts.First().Contact.Name)) 
       .ForMember(dest => dest.ContactEmail, options => options.MapFrom(source => source.SupplierContacts.First().Contact.Email)) 
       .ForMember(dest => dest.ContactTelephone, options => options.MapFrom(source => source.SupplierContacts.First().Contact.Telephone)) 
       .ForMember(dest => dest.ContactJobTitle, options => options.MapFrom(source => source.SupplierContacts.First().Contact.JobTitle)); 

Как вы можете видеть, у меня есть пользовательская логика для каждого столбца. Теперь проблема, если нет контакта/адрес, код ломается, потому что я использую

First()

от LINQ, есть лучший способ проверить, если контакты существует, то сделать отображение и если у него есть адреса, а затем продолжить сопоставление адресов?

+0

, пожалуйста, отправьте код класса поставщика –

ответ

0

Просто создайте ContactDto и добавьте его в ProviderDto, а затем переместите все свойства, связанные с контактом, в ContactDto.

public class ContactDto 
{ 
    public string Line1 { get; set; } 
    public string Line2 { get; set; } 

    public string Line3 { get; set; } 
    public string Line4 { get; set; } 
    public int CountryId { get; set; } 
    public string PostalCode { get; set; } 

    public string ContactName { get; set; } 
    public string ContactEmail { get; set; } 
    public string ContactTelephone { get; set; } 
    public string ContactJobTitle { get; set; } 
} 

public class SupplierDto 
{ 
    public string Name { get; set; } 
    public string Alias { get; set; } 
    public int? SupplierTypeId { get; set; } 
    public int? WebclicsManufacturerId { get; set; } 
    public string SAPCode { get; set; } 

    public ContactDto Contact { get; set; } 
} 

Тогда отображение должно выглядеть как этот

CreateMap<Supplier, SupplierDto>() 
    .ForMember(dest => dest.Contact, options => options.MapFrom(source => source.SupplierContacts.FirstOrDefault())); 

Если Контакт является пустым, то AutoMapper не пытался отобразить его. Если вы хотите, чтобы в будущем поддерживалась несколько контактов на Поставщике, просто измените свойство ContactDto Contact на List<ContactDto> и удалите .FirstOrDefault() в картографии.

Смежные вопросы