将多个源自动映射到一个目标

时间:2016-02-12 03:31:52

标签: c# automapper

我一直在筛选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>();

父级别人员数据能够正确映射,但子级别公司和角色级别数据不能。

我不确定如何处理第三部分(将该项目映射到集合中的项目)。

最干净的方法是什么?

1 个答案:

答案 0 :(得分:2)

我使用了以下技术并且效果很好。

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;

    }