如何使用 Automapper 或 LINQ 将具有嵌套列表的一个对象映射到对象列表?

How to map one object with nested list to list of objects using Automapper or LINQ?

我有这样的模型:

    public class Student
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }

    public class Exam
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }​

   ​ public class StudentExam
   ​ {
        ​public int Id { get; set; }
       ​ public int StudentId { get; set; }
       ​ public string ExamId{ get; set; }
   ​ }

StudentExam 对于模型 Student 和 Exam 是 link table。从前端应用程序中,我收集了这个模型中的一些数据:

   ​public class StudentExamModel
   ​{
       ​public int StudentId { get; set; }
       ​public List<Exam> Exams { get; set; }
   ​}

因此,在这个 StudentExamModel 中,我有例如 StudentId = 3,其中包含 3 个 ID 为 1、2 和 3 的考试列表(现在考试名称并不重要)。我可以使用 Automapper 将此 StudentExamModel 映射到 StudentExam,所以我在 StudentExam 中有 3 行,如下所示:

    ​StudentId ExamId
   ​  3         1
   ​  3         2
   ​  3         3

?

这个配置文件怎么样?

public class MyMapping : Profile
{
    public MyMapping()
    {
        CreateMap<StudentExamModel, IReadOnlyList<StudentExam>>()
            .ConvertUsing(model => model.Exams
                                .Select(exam => new StudentExam { StudentId = exam.Id, ExamId = exam.Id.ToString() })
                                .ToList());
    }
}

用法:

var config = new MapperConfiguration(conf => conf.AddProfile<MyMapping>());
var mapper = config.CreateMapper();

var source = new StudentExamModel
{
    StudentId = 3,
    Exams = new List<Exam>
    {
        new Exam { Id = 1 },
        new Exam { Id = 2 },
        new Exam { Id = 3 },
    }
};

var dest = mapper.Map<IReadOnlyList<StudentExam>>(source);

foreach (var item in dest)
{
    Console.WriteLine($"{item.StudentId} - {item.ExamId}");
}

这里是corresponding fiddle。而且,如果您已经提供了这样一个 fiddle,其中只缺少映射本身,那么帮助您就容易多了。 ;-)