Mapster技术问题:如何将父类属性映射至子列表项属性
使用Mapster实现父类Id到子类列表属性的映射
针对你的需求,有三种常用的实现方式:
方式一:配置子类型映射时获取父级上下文
Mapster允许在子类型映射中访问父级的源对象,通过上下文自动传递父类的Id到子DTO的IdPerson属性:
// 配置PersonalAsset到PersonalAssetDto的映射,从父级Person对象获取Id config.NewConfig<PersonalAsset, PersonalAssetDto>() .Map(dest => dest.IdPerson, ctx => ctx.ParentSource<Person>().Id); // 配置Person到PersonDto的默认映射,列表会自动应用上述子类型配置 config.NewConfig<Person, PersonDto>();
方式二:使用AfterMap手动赋值
如果需要更直接的控制,可以在父类映射的后置处理阶段遍历子列表完成赋值:
config.NewConfig<Person, PersonDto>() .AfterMap((src, dest) => { if (dest.PersonalAssets != null && !string.IsNullOrEmpty(src.Id)) { foreach (var assetDto in dest.PersonalAssets) { assetDto.IdPerson = src.Id; } } });
方式三:投影查询(适用于EF Core场景)
如果是从数据库查询时直接生成DTO,可以结合LINQ和Mapster的投影能力,生成更高效的SQL:
var personDtos = dbContext.Persons .ProjectToType<PersonDto>(config) .Select(p => new PersonDto { Id = p.Id, FullName = p.FullName, PersonalAssets = p.PersonalAssets.Select(a => new PersonalAssetDto { Id = a.Id, IdPerson = p.Id, Descrip = a.Descrip, Value = a.Value }).ToList() }) .ToList();
说明
- 方式一最贴合Mapster的设计思路,无需手动遍历,由框架自动处理父级数据传递。
- 方式二更灵活,适合需要额外逻辑处理的场景。
- 方式三在EF Core环境下能避免内存中遍历,直接通过SQL完成字段赋值,性能更优。
内容的提问来源于stack exchange,提问作者Esteban Hugo Somma
相关产品推荐
相关产品推荐

