我一直在筛选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>();
父级别人员数据能够正确映射,但子级别公司和角色级别数据不能。
我不确定如何处理第三部分(将该项目映射到集合中的项目)。
最干净的方法是什么?
答案 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;
}