简体   繁体   中英

Automapper Sub Property Mapping

I have a situation where I need to map a sub-collection of items within an object to a collection of items in another object. I am essentially trying to flatten the object for use by a consuming system.

Given the following entity classes:

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; }
}

I need to map the OutcomeEntity and GradeEntity to the following flattened structure where there can be many outcomes, containing many different grades:

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; }

}

Basically, for every Outcome in the collection, I want to iterate over the grades within it and create a new object (GradeDTO).

I have attempted to create a basic map, but I simply cannot get my head around the sub-properties.

To create one collection from many you can use SelectMany extension method. With this method and the following configuration AutoMapper will create PersonDto from 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)));
});

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM