簡體   English   中英

自動將多個源映射到一個目標

[英]Automapper multiple source to one destination

我一直在仔細閱讀AutoMapper文檔和相關問題,以嘗試找到針對此問題的推薦解決方案,但未能找到它。

假設我有一個類似以下的來源:

public class Person{
   public string PersonId{get;set;}
   public string FirstName {get;set;}
   public string LastName{get;set;}
   public List<Company> Companies {get;set;}
}

public class Company{
   public string CompanyName {get;set;}
   public string CompanyAddress {get;set;}
   public List<UserRoles> UserRoles
}

public class UserRoles{
   public string PersonId{get;set;}
   public List<Roles> Roles {get;set;}
}

public class Roles{
   public string RoleId{get;set;}
   public string RoleDescription {get;set;}
}

我想將上述源對象映射到目標對象,如下所示:

public class Person{
   public string PersonId{get;set;}
   public string FirstName {get;set;}
   public string LastName{get;set;}
   public List<CompanyViewModel> CompanyViewModel {get;set;}
}

public class CompanyViewModel{
   public string CompanyName {get;set;}
   public string CompanyAddress {get;set;}
   public List<RolesViewModel> RolesViewModel {get;set;}
}

public class RolesViewModel{
   public string RoleId{get;set;}
   public string RoleDescription {get;set;}
}

我試過下面的代碼一起映射:

CreateMap<Person, PersonViewModel>();

CreateMap<Company, CompanyViewModel>();

CreateMap<UserRoles, IEnumerable<CompanyViewModel>>()
                   .ConvertUsing<CompanyRolesMapping>(); // Not sure

CreateMap<Roles, RolesViewModel>();

父級人員數據能夠正確映射,而子級公司和角色級數據則不能。

我不確定如何進行第三部分(將該項目映射到集合中的項目)。

最干凈的方法是什么?

我使用了以下技術,效果很好。

public void IntializeUserCompanyRolesMapping()
{
            CreateMap<Roles, RolesViewModel>();

            CreateMap<ICollection<Roles >, CompanyViewModel>()
                .ForMember(d => d.CompanyName , opt => opt.Ignore())
                .ForMember(d => d.CompanyAddress , opt => opt.Ignore())
                .ForMember(d => d.RolesViewModel, opt => opt.MapFrom(s => s));

            CreateMap<UserRoles, CompanyViewModel>()
                .ForMember(d => d.RolesViewModel , opt => opt.MapFrom(s => s.Roles ));

            CreateMap<Person, Person>()
                .ForMember(d => d.CompanyViewModel , opt => opt.MapFrom(s => MapCompanyToCompanyViewModel(s.Companies )));

}               

我使用自定義方法遍歷公司列表,並將其添加到公司視圖模型列表中。

    private Collection<CompanyViewModel> MapCompanyToCompanyViewModel(ICollection<Company> Companies )
    {
        var companyViewModels = new Collection<CompanyViewModel>();
                foreach (var company in Companies)
        {
            foreach (var companyViewModel in company.UserRoles.Select(Mapper.Map<CompanyViewModel>))
            {
                companyViewModels.Add(companyViewModel);
            }
        }
        return companyViewModels;

    }

暫無
暫無

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

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