Search code examples
entity-frameworklinq

Can someone pls help me translate LINQ Query Syntax to Method Syntax?


I've been trying to figure out how to translate the following LINQ query syntax to method syntax, but I just don't get it:

from exa in _context.Exams
from stu in exa.Class.Students
where exa.Id == 1
select new StudentFullName
{
    Id = stu.Id,
    FullName = stu.Person.FirstName + " " + stu.Person.LastName
}

The property ICollection<Student> Students from the table Classes for the many-to-many relationship with Students is causing my confusion.

I tried this:

_context.Exams
.Where(exa => exa.Id == id)
.Select(exa => new StudentFullName
{
    Id = exa.Class.Students.Select(stu => stu.Id),
    FullNamee = exa.Class.Students.Select(stu => stu.Person.FirstName + " " + stu.Person.LastName)
}).ToList();

But I can't create the class StudentFullName because the query returns IEnumerable<int> instead of int for each property.

That's what I get: https://i.sstatic.net/7fcxx.jpg

That's what I should get: https://i.sstatic.net/oy0hT.jpg

EDIT: Tweaked the solution from tymtam and it worked

_context.Exams
.Where(exa => exa.Id == id)
.SelectMany(exa => exa.Class.Students
  .Select(stu => new StudentFullNameViewModel
  {
      Id = stu.Id,
      FullName = stu.Person.FirstName + " " + stu.Person.LastName
  })
).ToList()

Solution

  • It's very suspicious that:

    1. there is no join between students and exams
    2. exa is not used in the result object

    A 1-to-1 translation is I think this:

    var students2 = exams
      .Where(exa => exa.Id == id)
      .SelectMany(exa => exa.Class.Students
        .Select(stu => new StudentFullName
        {
            Id = stu.Id,
            FullNamee = stu.Person.FirstName + " " + stu.Person.LastName
        }))
      .ToList();