Сопоставьте две коллекции разного типа с помощью автоматического сопоставления

#c# #collections #automapper

Вопрос:

У меня есть DTO и сущность, которая называется QuestionnaireSubmission mapper, вместе, как это :

 public QuestionSubmissionMapper() => this.CreateMap<DTO.QuestionnaireSubmission, QuestionnaireSubmission>()
            .ForMember(d => d.ParticipantId, d => d.MapFrom(s => s.ParticipationId))
            .ForMember(d => d.SurveyVersionId, d => d.MapFrom(s => s.Survey.Version))
            .ForMember(d => d.RespondantAnswers, d => d.MapFrom(s => s.States));
 

Моя проблема в том, что я не могу понять, как составить карту s.States of type State[] и RespondantAnswers of type IEnumerable<RespondantAnswer>

Я уже создал карту между этими двумя классами, чтобы сопоставить их.

  this.CreateMap<State, RespondantAnswer>()
                .ForMember(d => d.QuestionId, d => d.MapFrom(s => s.Subject))
                .ForMember(..)
                .ForMember(..);
 

Однако Automapper, похоже, не может выполнить сопоставление… Что я упускаю? Действительно ли я должен использовать эту .ConvertUsing() функцию?

Ответ №1:

Я не могу воспроизвести проблему, но, похоже, следующее работает так, как ожидалось. AutoMapper должен уметь обрабатывать коллекции без специальной настройки:

 var mapper = new MapperConfiguration(cfg => {
    cfg.CreateMap<SourceQuestionnaireSubmission, DestQuestionnaireSubmission>()
        .ForMember(d => d.ParticipantId, d => d.MapFrom(s => s.ParticipationId))
        .ForMember(d => d.SurveyVersionId, d => d.MapFrom(s => s.Survey.Version))
        .ForMember(d => d.RespondantAnswers, d => d.MapFrom(s => s.States));

    cfg.CreateMap<State, RespondantAnswer>()
        .ForMember(d => d.QuestionId, d => d.MapFrom(s => s.QuestionId));

    })
    .CreateMapper();

var source = new SourceQuestionnaireSubmission
{
    ParticipationId = 1,
    Survey = new Survey { Version = 10 },
    States = new []
    {
        new State { QuestionId = 100 },
        new State { QuestionId = 999 }
    }
};
        
var dest = mapper.Map<SourceQuestionnaireSubmission, DestQuestionnaireSubmission>(source);

Console.WriteLine("ParticipantId: {0}", dest.ParticipantId);
Console.WriteLine("SurveyVersionId: {0}", dest.SurveyVersionId);
Console.WriteLine("RespondantAnswers: {0}",
    string.Join(", ", dest.RespondantAnswers.Select(a => a.QuestionId)));

// Output:
// ParticipantId: 1
// SurveyVersionId: 10
// RespondantAnswers: 100, 999
 

Посмотрите эту скрипку для демонстрации.

Комментарии:

1. Спасибо!!! Я чувствую себя глупо, моя неопытность в AutoMapper помешала мне прочитать дальше : «AutoMapper. Исключение AutoMapperMappingException : Типы сопоставления ошибок.» Произошла ошибка преобразования между двумя свойствами (попытка ввести значение d в Int32 ), что привело к сбою преобразования. Моя настройка работает идеально.