如何使用AutoMapper将Customer列表映射为含Hobbies的Person列表
解决AutoMapper映射Customer列表到带Hobbies的Person列表问题
1. 先明确类结构与映射前提
先假设你的类结构大致如下(如果实际结构不同,可对应调整映射逻辑):
// 原始Customer类 public class Customer { public int PersonId { get; set; } public string PersonName { get; set; } // 单个Customer对应单个爱好信息,或包含爱好集合 public int HobbyId { get; set; } public string HobbyName { get; set; } // 或者如果一个Customer带多个爱好:public List<CustomerHobby> CustomerHobbies { get; set; } } // 目标Person类 public class Person { public int Id { get; set; } public string Name { get; set; } public List<Hobby> Hobbies { get; set; } } // Hobby类 public class Hobby { public int Id { get; set; } public string Name { get; set; } }
2. 分场景处理映射逻辑
场景一:Customer列表中,同一Person对应多条记录(每条对应一个Hobby)
这种情况下需要先按Person的唯一标识(比如PersonId)分组,再合并Hobbies:
// 1. 按PersonId分组Customer var groupedCustomers = customers.GroupBy(c => c.PersonId); // 2. 遍历分组映射成Person对象 var persons = groupedCustomers.Select(group => { // 取分组内第一条数据映射基础Person信息 var person = _mapper.Map<Person>(group.First()); // 将分组内所有Customer映射为Hobby列表 person.Hobbies = _mapper.Map<List<Hobby>>(group.ToList()); return person; }).ToList();
场景二:单个Customer本身包含多个Hobby的集合(比如CustomerHobbies属性)
这种情况直接在AutoMapper配置中指定Hobbies字段的来源即可:
// 定义映射Profile public class AppMappingProfile : Profile { public AppMappingProfile() { // Customer到Person的映射,指定Hobbies从CustomerHobbies映射 CreateMap<Customer, Person>() .ForMember(dest => dest.Hobbies, opt => opt.MapFrom(src => src.CustomerHobbies)); // 配置CustomerHobby到Hobby的映射 CreateMap<CustomerHobby, Hobby>(); } }
之后直接调用以下代码即可完成映射:
var persons = _mapper.Map<List<Person>>(customers);
3. 验证映射结果
映射完成后,可通过调试或打印输出,检查每个Person对象的Hobbies字段是否正确填充了对应的数据,确保映射逻辑符合预期。
内容的提问来源于stack exchange,提问作者blankface
相关产品推荐
相关产品推荐

