var query = from student in students
join grade in grades on student.StudentId equals grade.StudentId into studentGrades
from grade in studentGrades.DefaultIfEmpty()
select new
{
StudentName = student.Name,
StudentGrade = grade?.GradeName ?? "成績なし"
};
SQLと考え方が違うので、わかりにくいですが、
into
でstudentGradesとしていったん取得して、
そこから、DefaultIfEmpty()
で存在しない場合は,nullで取得するようにgrade
を再定義します。