kristian
kristian

Reputation: 23039

LINQ - joining multiple lists

I've looked at the 101 Linq Samples here but I can't see anything like this in that list. If I'm just not seeing a relevant example there, please link to it.

If I have these 3 classes:

class Student { int id; string name }
class Course { int id, string name }
class Enrolment { int studentId; int courseId; }

How would I use LINQ to get a list of courses a student is enrolled on? (assume I have an IList of all three classes)

Upvotes: 2

Views: 3762

Answers (3)

Martin R-L
Martin R-L

Reputation: 4037

Not an explicit answer, but perhaps implicitly helpful building your system.

Have you considered a richer domain model like so:

class Student { int id; string name; IEnumerable<Enrolment> enrolments }
class Course { int id, string name; }
class Enrolment { Student student; Course course; }

?

The Student class could then have a method GetEnroledCourses() like so:

public IEnumerable<Course> GetEnroledCourses()
{
   return enrolements.Select(enrolement => enrolement.Course).ToList().AsReadonly();
}

A model that's merely a one-to-one mapping to the database suffice in some contexts, but if you have complex business logic such an «anemic domain model» might bite you.

Upvotes: 1

Adam Robinson
Adam Robinson

Reputation: 185703

var courses = (from course in courseList 
    join enr in enrolmentList on enr.courseId equals course.id 
    where enr.studentId = <student id variable> 
    select course);

Upvotes: 0

Jon Skeet
Jon Skeet

Reputation: 1503839

How about:

IEnumerable<Course> FindCoursesForStudent(Student student)
{
    return from enrolment in Enrolments 
           where enrolment.studentId == student.id
           join course in Courses
              on enrolment.courseId equals course.id
           select course;
}

Upvotes: 10

Related Questions