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

如何使用AutoMapper实现多表关联数据到数组的映射

问题描述

我拥有三张数据表:

Company表

IdName
1Company 1
2Company 2

Users表

IdName
1d0ba340-7ff6-47a4-a9a4-46345a228e53User 1
229c4525-e12d-4a01-8eda-e611ca8b721cUser 2

UserCompany关联表

IdUserIdCompanyId
0DCA3DBE-747F-489B-A85D-2BE7E1A031401d0ba340-7ff6-47a4-a9a4-46345a228e531
123C04DB-A62B-4B4A-AA5C-CE1E35540BB01d0ba340-7ff6-47a4-a9a4-46345a228e532
2306F3EA-173F-4F47-8C11-62C29A963C9F229c4525-e12d-4a01-8eda-e611ca8b721c2

我定义了如下DTO,用于映射Company表并携带分配给该公司的用户名称列表:

public record CompanyDto(
    int Id,
    string Name, 
    IEnumerable<string> UsersList);

请问如何使用AutoMapper实现将Company表数据与关联的用户名称列表映射到上述DTO的需求?


解决方案

要实现这个映射,可按以下步骤配置AutoMapper:

1. 确保实体类定义正确

先定义对应数据表的实体类,包含必要的导航属性以关联数据:

// Company实体
public class Company
{
    public int Id { get; set; }
    public string Name { get; set; }
    public ICollection<UserCompany> UserCompanies { get; set; } = new List<UserCompany>();
}

// User实体
public class User
{
    public Guid Id { get; set; }
    public string Name { get; set; }
    public ICollection<UserCompany> UserCompanies { get; set; } = new List<UserCompany>();
}

// UserCompany关联实体
public class UserCompany
{
    public Guid Id { get; set; }
    public Guid UserId { get; set; }
    public int CompanyId { get; set; }
    public User User { get; set; }
    public Company Company { get; set; }
}

2. 配置AutoMapper映射规则

创建映射配置类,指定Company到CompanyDto的映射逻辑:

public class MappingProfile : Profile
{
    public MappingProfile()
    {
        CreateMap<Company, CompanyDto>()
            // 自动匹配Id、Name等同名属性,仅需配置UsersList的映射
            .ForMember(dest => dest.UsersList, opt => 
                opt.MapFrom(src => src.UserCompanies.Select(uc => uc.User.Name)));
    }
}

3. 注册AutoMapper并执行映射

在依赖注入容器中注册AutoMapper(以ASP.NET Core为例):

builder.Services.AddAutoMapper(typeof(MappingProfile));

在业务逻辑中注入IMapper,加载关联数据后执行映射:

public class CompanyService
{
    private readonly IMapper _mapper;
    private readonly YourDbContext _dbContext;

    public CompanyService(IMapper mapper, YourDbContext dbContext)
    {
        _mapper = mapper;
        _dbContext = dbContext;
    }

    public IEnumerable<CompanyDto> GetCompaniesWithUsers()
    {
        // 加载关联数据,避免N+1查询问题
        var companies = _dbContext.Companies
            .Include(c => c.UserCompanies)
            .ThenInclude(uc => uc.User)
            .ToList();
        
        return _mapper.Map<IEnumerable<CompanyDto>>(companies);
    }
}

关键注意点

  • 查询时必须通过Include和ThenInclude加载UserCompany和User的关联数据,否则UsersList会返回空集合。
  • AutoMapper会自动匹配同名的简单属性,无需额外配置。
  • 若实体导航属性命名不同,需调整MapFrom中的表达式路径。

内容的提问来源于stack exchange,提问作者Zulfikar Badurdeen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 08:40:28