首页 > 解决方案 > 自动映射器中的多个映射

问题描述

我最近遇到了一个自动映射器。我有一个问题,如何将我的存储库中的多个对象映射到一个 DTO 中。

public QuestionProfile()
{
    CreateMap<Question, GrammarQuestionDTO>()
        .ForMember(g => g.Question, q => q.MapFrom(source => source.Text)).ReverseMap();

    CreateMap<List<GrammarQuestionDTO>, TestDTO>()
        .ForMember(t => t.GrammarQuestion, g => g.MapFrom(source => source)).ReverseMap();

    CreateMap<Question, AuditionQuestionDTO>()
        .ForMember(a => a.Question, q => q.MapFrom(source => source.Text))
        .ForMember(a => a.Url, q => q.MapFrom(source => source.AudioFile.Url)).ReverseMap();

    CreateMap<List<AuditionQuestionDTO>, TestDTO>()
        .ForMember(t => t.AuditionQuestion, a => a.MapFrom(source => source)).ReverseMap();
}

如何映射所有这 4 个对象?

public async Task<TestDTO> GenerateTest(LevelType level)
{
    var grammarQuestions = await _questionRepository.GetGrammarQuestionAsync(level);
    var auditionQuestions = await _questionRepository.GetAuditionQuestionAsync(level);
    var essayTopic = await _questionRepository.GetEssayTopicAsync(level);
    var speakingTopic = await _questionRepository.GetSpeakingTopicAsync(level);

    var test = _mapper.Map<TestDTO>(grammarQuestions);
    test = _mapper.Map(test, auditionQuestions); //there will be a conversion error

    return _mapper.Map<TestDTO>(grammarQuestions);
}

标签: c#asp.net.netautomapper

解决方案


您需要在没有列表的情况下对其进行映射,只需将其一一映射并AutoMapper处理集合:

CreateMap<AuditionQuestionDTO, TestDTO>()
    .ForMember(t => t.AuditionQuestion,
               a => a.MapFrom(source => source.<PropertyName>)).ReverseMap();

然后在地图上你应该:

test = _mapper.Map<List<AuditionQuestionDTO>>(test, auditionQuestions);

推荐阅读