[英]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
中,您的映射IEnumerable
到List
並且在有效映射時,您正在從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.