簡體   English   中英

如何在 automapper 中為 aftermap 上的目標屬性賦值

[英]How to assign value to destination property on aftermap in automapper

我有這些課程

public class Student
{
    public int StudentId { get; set; }
    public int Name { get; set; }
    public string SubjectIds { get; set; } //Comma delimited string of subject ID
    public string Grades { get; set; } //Comma delimited string of subject ID
}


public class StudentListItemDto
{
    public int StudentId { get; set; }
    public int StudentName { get; set; }
    public IEnumerable<SubjectGradeDto> Tags { get; set; }
}

public class SubjectGradeDto 
{
    public int SubjectId { get; set; }
    public string Grade { get; set; }
}

在我的映射配置文件中,我有這個 map IEnumerable<Student>List<StudentListItemDto>

CreateMap<IEnumerable<Student>, List<StudentListItemDto>>()
        .AfterMap((src, dest) =>
            {
                List<StudentListItemDto> iStudentListItemDto;
                iStudentListItemDto= src.Select(p =>
                  new StudentListItemDto
                  {
                      StudentId= p.StudentId,
                      StudentName= p.Name,
                      Tags = p.SubjectIds!= null ? p.SubjectIds.Split(",").Select((tag, i) => new SubjectGradeDto { SubjectIds= int.Parse(tag), Grade= p.Grades.Split(",")[i] }) : null
                  }).ToList();
                dest = iStudentListItemDto; // I'm assigning values to destination
            });

我以這種方式映射它的原因是因為我需要 map 學生 class 的科目和成績屬性,這是IEnumerable<SubjectGradeDto>的逗號分隔值

對映射的進一步改進將不勝感激。

但我的問題是當我分配

dest = iStudentListItemDto;

在 AfterMap 中。 當我調試它時,它有一個值,但是當映射在這里執行時

IEnumerable<StudentListItemDto> iStudentListItemDto= new List<StudentListItemDto>();
        iStudentListItemDto = _mapper.Map<IEnumerable<Student>, IEnumerable<StudentListItemDto>>(searchResult, iStudentListItemDto);

其中搜索結果為IEnumerable<Student>

iStudentListItemDto評估為空列表。

問題是為什么?

在您的CreateMap中,您的映射IEnumerableList並且在有效映射時,您正在從IEnumerable映射到IEnumerable

List 是 IEnumerable,但 IEnumerable 基本上不是 List。

使用您創建的此映射,您只有從 IEnumerable 到 List 的方向。

一個更好的方法,我可以看到你只使用這種方式來映射標簽,是做這樣的事情

CreateMap<Student, StudentListItemDto>()
        .ForMember(dto => dto.StudentName, opt => opt.MapFrom(s => s.Name))
        .ForMember(dto => dto.Tags, opt => opt.Ignore())
        .AfterMap((student, dto) =>
            {
                dto.Tags = student.SubjectIds!= null ? student.SubjectIds.Split(",").Select((tag, i) => new SubjectGradeDto { SubjectIds= int.Parse(tag), Grade= student.Grades.Split(",")[i] }) : null;
            });

現在,如果 AutoMapper 發現您正在映射單個 object 或這些對象的列表,它將 map 正確地映射此列表的每個 object。

這是因為您沒有使用整個列表來創建此標簽列表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM