using System.Collections.Generic;
public static void Main()
var subjects = new List<Subject>
new Subject { SubjectID =1, Name = "Mathematics" },
new Subject { SubjectID =2, Name = "History" },
new Subject { SubjectID =3, Name = "Science" }
var subjectStudents = new List<SubjectStudent>
new SubjectStudent { SubjectStudentID =1, SubjectID = 2, StudentID = 1000 },
new SubjectStudent { SubjectStudentID =2, SubjectID = 1, StudentID = 1001 },
new SubjectStudent { SubjectStudentID =3, SubjectID = 3, StudentID = 1003 },
new SubjectStudent { SubjectStudentID =4, SubjectID = 1, StudentID = 1005 }
var studentsGrade = new List<StudentGrade>
new StudentGrade { StudentGradeID =1, StudentID = 1001, GradeID = 1 },
new StudentGrade { StudentGradeID =2, StudentID = 1003, GradeID = 2 },
new StudentGrade { StudentGradeID =3, StudentID = 1005, GradeID = 3 }
var result = (from s in subjects
join ss in subjectStudents on s.SubjectID equals ss.SubjectID into SubjectStudents
Students = from ss in SubjectStudents
join g in studentsGrade on ss.StudentID equals g.StudentID
select new { StudentId = ss.StudentID, GradeId = g.GradeID }
foreach (var subject in result)
Console.WriteLine("Subject: {0}",subject.SubjectID);
foreach (var student in subject.Students)
Console.WriteLine("Student: {0}",student.StudentId);
Console.WriteLine("\tGrade: {0}", student.GradeId);
public int SubjectID { get; set; }
public string Name { get; set; }
public class SubjectStudent
public int SubjectStudentID { get; set; }
public int SubjectID { get; set; }
public int StudentID { get; set; }
public class StudentGrade
public int StudentGradeID { get; set; }
public int StudentID { get; set; }
public int GradeID { get; set; }