簡體   English   中英

如何使用 Automapper map 一個源到多個目的地?

[英]How to map one source to multiple destinations using Automapper?

這是示例:實體:

public class Contact 
{ 
   public int Id { get; set; }

   ......

   public ICollection<ContactDetail> ContactDetails { get; set; }
}

public class ContactDetail 
{  
   public Guid Id { get; set; }

   public int ContactId { get; set; }

   public ContactDetailTypes ContactDetailType { get; private set; }
   
   public string Email { get; set; }

   public string Address { get; set; }

   public string Phone { get; set; }

   ......
}

public enum ContactDetailTypes : byte
    {
        Email = 1,
        Phone = 2,
        Address = 3,
        ......

    }


查看模型:

public class ContactViewModel
{  
   public int Id { get; set; }

   ......
   
   public ICollection<ContactEmailViewModel> ContactEmails { get; set; }
   public ICollection<ContactPhoneViewModel> ContactPhones { get; set; }
   public ICollection<ContactAddressViewModel> ContactAddresses { get; set; }
}


public class ContactEmailViewModel
{  
   public Guid Id { get; set; }

   public int ContactId { get; set; }
   
   public string Email { get; set; }
}

public class ContactPhoneViewModel
{  
   public Guid Id { get; set; }

   public int ContactId { get; set; }
   
   public string Phone { get; set; }
}

public class ContactAddressViewModel
{  
   public Guid Id { get; set; }

   public int ContactId { get; set; }
   
   public string Address { get; set; }
}

我想將 map ContactDetail 轉為 ContactEmailViewModel、ContactPhoneViewModel、ContactAddressViewModel:

         CreateMap<ContactDetail, ContactEmailViewModel>()
                .ForMember(dest => dest.Id, opts => 
                {
                    opts.PreCondition(s => s.ContactDetailType == ContactDetailTypes.Email);
                    opts.MapFrom(src => src.Id); 
                })
                .ForMember(dest => dest.ContactId, opts => 
                {
                    opts.PreCondition(s => s.ContactDetailType == ContactDetailTypes.Email);
                    opts.MapFrom(src => src.ContactId);
                })
                .ForMember(dest => dest.Email, opts => 
                {
                    opts.PreCondition(s => s.ContactDetailType == ContactDetailTypes.Email);
                    opts.MapFrom(src => src.Email); 
                });

(Phone, Address map are similar to above)
    

當我使用上述配置文件 map 聯系 ContactViewModel 時,ContactEmails、ContactPhones、ContactAddresses 的計數始終為 0。我認為自動映射器可以將 detailType 和 map 源檢查到不同的目的地,但失敗了。

如果我創建一個具有這三個視圖 model 的所有屬性的 ContactDetailViewModel,它會將所有屬性從 ContactDetail 映射到 ContactDetailViewModel。

本例中如何使用Automapper實現一個源到多個目標的映射?

更新:我添加了一個新的 map 仍然沒有運氣:

CreateMap<ICollection<ContactDetail>, ContactViewModel>()  
.ForMember(dest => dest.ContactEmails, opts => opts.MapFrom(src => src.Where(s => s.ContactDetailType == ContactDetailTypes.Email)))
.ForMember(dest => dest.ContactPhones, opts => opts.MapFrom(src => src.Where(s => s.ContactDetailType == ContactDetailTypes.Phone)))
.ForMember(dest => dest.ContactAddresses, opts => opts.MapFrom(src => src.Where(s => s.ContactDetailType == ContactDetailTypes.Address)));

只是為什么我的帖子被投入了......我問是因為我嘗試了幾次真的找不到答案......

最后讓它工作如下:

 CreateMap<Contact, ContactViewModel>()
                .ForMember(dest => dest.Id, opts => opts.MapFrom(src => src.Id))
                ...
                .ForMember(dest => dest.ContactEmails, opts => opts.MapFrom(src => src.ContactDetails.Where(s => s.ContactDetailType == ContactDetailTypes.Email)))
                .ForMember(dest => dest.ContactPhones, opts => opts.MapFrom(src => src.ContactDetails.Where(s => s.ContactDetailType == ContactDetailTypes.Phone)))
                .ForMember(dest => dest.ContactAddresses, opts => opts.MapFrom(src => src.ContactDetails.Where(s => s.ContactDetailType == ContactDetailTypes.Address)));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM