¿Cómo mapear un objeto con una lista anidada a una lista de objetos usando Automapper o LINQ?

¿Cómo mapear un objeto con una lista anidada a una lista de objetos usando Automapper o LINQ?

La solución para ¿Cómo asignar un objeto con una lista anidada a una lista de objetos usando Automapper o LINQ?
se proporciona a continuación:

Tengo modelos como este:

    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 es una tabla de enlaces para los modelos Student y Exam. Desde la aplicación frontend, recopilo algunos datos en este modelo:

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

Entonces, en este StudentExamModel tengo, por ejemplo, StudentId =3 con una lista de 3 exámenes con Ids 1, 2 y 3 (los nombres de los exámenes no son importantes en este momento). ¿Puedo asignar este StudentExamModel a StudentExam usando Automapper, por lo que tengo 3 filas dentro de StudentExam como esta:

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

?

¿Qué tal este perfil?

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());
    }
}

Uso:

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}");
}

Aquí está el violín correspondiente. Y si ya había proporcionado un violín en el que solo faltaba el mapeo, habría sido mucho más fácil ayudarlo. 😉