Automapper Sub Property Mapping - PullRequest
       7

Automapper Sub Property Mapping

0 голосов
/ 11 декабря 2018

У меня есть ситуация, когда мне нужно сопоставить под коллекцию элементов в объекте с коллекцией элементов в другом объекте.По сути, я пытаюсь сгладить объект для использования системой-потребителем.

Учитывая следующие классы сущностей:

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 голосов
/ 11 декабря 2018

Чтобы создать одну коллекцию из многих, вы можете использовать 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)));
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...