Automapper子属性映射

时间:2018-12-10 21:22:38

标签: c# asp.net-core automapper

我遇到一种情况,我需要将一个对象中的项的子集合映射到另一个对象中的项的集合。我实质上是在尝试使该对象变平以供消费系统使用。

给出以下实体类:

public class PersonEntity
{
    public int Id { get; set; }
    public virtual ICollection<OutcomeEntity> Outcomes { get; set; }

}

public class OutcomeEntity
{
    public int Id { get; set; }
    public bool Outcome { get; set; }
    public virtual ICollection<GradeEntity> Grades { get; set; }
    public PersonEntity Person { get; set; }

}

public class GradeEntity
{
    public int Id { get; set; }
    public string Grade { get; set; }
    public string MarkersComment { get; set; }
    public OutcomeEntity Outcome { get; set; }
}

我需要将OutcomeEntity和GradeEntity映射到以下扁平化的结构,其中可能会有很多结果,其中包含许多不同的等级:

public class PersonDTO
{
    public int PersonId { get; set; }
    public virtual ICollection<GradeDTO> Grades { get; set; }

}

public class GradeDTO
{
    public int OutcomeId { get; set; }
    public int GradeId { get; set; }
    public string Grade { get; set; }
    public string MarkersComment { get; set; }

}

基本上,对于集合中的每个结果,我都希望迭代其中的成绩并创建一个新对象(GradeDTO)。

我试图创建一个基本地图,希望有人可以帮助我正确完成它,我简直无法理解子属性。

1 个答案:

答案 0 :(得分:1)

要从多个集合中创建一个集合,可以使用SelectMany扩展方法。通过这种方法和以下配置,AutoMapper将从PersonDto创建PersonEntity

Mapper.Initialize(cfg => 
{
    cfg.CreateMap<GradeEntity, GradeDTO>()
        .ForMember(dto => dto.GradeId, x => x.MapFrom(g => g.Id))
        .ForMember(dto => dto.OutcomeId, x => x.MapFrom(g => g.Outcome.Id));

    cfg.CreateMap<PersonEntity, PersonDTO>()
        .ForMember(dto => dto.PersonId, x => x.MapFrom(p => p.Id))
        .ForMember(dto => dto.Grades, x => x.MapFrom(p => p.Outcomes.SelectMany(o => o.Grades)));
});