You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 06:08:23