首页 > 解决方案 > 如何映射 IEnumerable使用 Automapper 按 Id 属性分组的属性

问题描述

我有这些课程

public class StudentModel
{
    public int StudentId { get; set; }
    public string Name { get; set; }
    public int SubjectId { get; set; }
    public string SubjectLabel { get; set; }
    public string SubjectCode { get; set; }
}

public class StudentDto
{
    public int StudentId { get; set; }
    public string Name { get; set; }
    public IEnumerable<SubjectDto> Subjects { get; set; }
}

public class SubjectDto
{
    public int SubjectId { get; set; }
    public string SubjectLabel { get; set; }
    public string SubjectCode { get; set; }
}

假设我返回了这些数据

StudentId    Name    SubjectId    SubjectLabel    SubjectCode
1            alex      1           physics 1         phys1
1            alex      2           english           eng1
2            ryan      1           physics 1         phys1
2            ryan      3           algebra           alg 

我如何映射这个?

标签: c#asp.net-core-mvcautomapper

解决方案


像这样:

初始化映射规则

private static void InitializeAutomapper()
{
    AutoMapper.Mapper.Initialize(config =>
    {
        config.CreateMap<IGrouping<int, StudentModel>, StudentDto>()
            .ForMember(dest => dest.StudentId, opt => opt.MapFrom(src => src.Key))
            .ForMember(dest => dest.Name, opt => opt.MapFrom(src => src.First().Name))
            .ForMember(dest => dest.Subjects, opt => opt.MapFrom(src => src.ToList()));
        config.CreateMap<StudentModel, SubjectDto>();
    });
}

分组依据和映射

var data = new List<StudentModel>
{
    new StudentModel
    {
        StudentId = 1,
        Name = "alex"  ,
        SubjectId    =1   ,
        SubjectLabel   = "physics",
        SubjectCode = "phys1"
    },
    new StudentModel
    {
        StudentId = 1,
        Name = "alex"  ,
        SubjectId    =2   ,
        SubjectLabel   = "english",
        SubjectCode = "eng1"
    },
    new StudentModel
    {
        StudentId = 2,
        Name = "ryan"  ,
        SubjectId    = 1   ,
        SubjectLabel   = "physics",
        SubjectCode = "phys1"
    },
    new StudentModel
    {
        StudentId = 2,
        Name = "ryan"  ,
        SubjectId    = 3   ,
        SubjectLabel   = "algebra",
        SubjectCode = "alg"
    }
};

List<IGrouping<int, StudentModel>> studentModels = data.GroupBy(s => s.StudentId).ToList();

var result = AutoMapper.Mapper.Map<List<IGrouping<int, StudentModel>>, List<StudentDto>>(studentModels);

推荐阅读