Rukshod
Rukshod

Reputation: 132

LINQ - nested GroupJoin

I have looked at many LINQ examples on how to do GroupJoin. But I am not sure how to perform nested GroupJoin. Does somebody have any idea?

I have a following simple classes:

public class Subject
{
    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; }
}

var subjects = (from s in Subject
                join ss in SubjectStudent on s.SubjectID equals ss.SubjectID into SubjectStudents
                select new 
                {
                    SubjectID = s.SubjectID,
                    Students = SubjectStudents
                })
                .ToList();

foreach (var subject in subjects)
{
    foreach(var student in subject.Students)
    {
        //foreach(var grade in student.Grades)
        //{
        //      I want to get grades for each subject.Students
        //}
    }
}

Can I have another GroupJoin after SubjectStudents, i.e. StudentGrades? I want to be able to iterate over StudentGrades in each subject.Students.

Thank you for any help.

Upvotes: 1

Views: 802

Answers (1)

Rahul Singh
Rahul Singh

Reputation: 21825

Your data structure looks a bit confusing to me. Also, not sue if this is what you expect:-

var result = (from s in subjects
         join ss in subjectStudents on s.SubjectID equals ss.SubjectID into SubjectStudents
              select new
                        {
                           SubjectID = s.SubjectID,
                           Students = from ss in SubjectStudents
                               join g in studentsGrade on ss.StudentID equals g.StudentID 
                               select new 
                                      { 
                                           StudentId = ss.StudentID, 
                                           GradeId = g.GradeID 
                                      }
                           })
                .ToList();

Sample Fiddle

Upvotes: 3

Related Questions