我遇到一种情况,我需要将一个对象中的项的子集合映射到另一个对象中的项的集合。我实质上是在尝试使该对象变平以供消费系统使用。
给出以下实体类:
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)。
我试图创建一个基本地图,希望有人可以帮助我正确完成它,我简直无法理解子属性。
答案 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)));
});