2009-04-16 7 views
2

Si j'ai ces 3 classes:LINQ - regroupement et l'agrégation

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

Ensuite, en utilisant ceci:

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; 
} 

Je peux énumérer tous les cours d'un étudiant est inscrit sur.

Mais si un étudiant s'est inscrit à un cours plusieurs fois, comment afficherais-je seulement l'inscription la plus récente pour chaque cours?

Je suppose que je dois regrouper par cours et filtrer où enrolmentDate = Max (enrolmentDate) ou quelque chose de similaire?

(Si cela semble familier, il est parce qu'il est un suivi sur de mon previous LINQ question.)

Répondre

2
Enumerable<Course> FindCoursesForStudent(Student student) 
{ 
    return from enrolment in Enrolments 
      where enrolment.studentId == student.id 
      && enrolment.enrolmentDate == (from ed in Enrolments 
      where ed.enrolmentDate == enrolment.enrolmentDate 
      select ed.enrolmentDate).Max() 
      join course in Courses 
       on enrolment.courseId equals course.id 
      select course; 
} 
1

Pour obtenir pour chaque cours un étudiant a pris l'inscription le plus récent, j'utiliser quelque chose comme:

IEnumerable<Enrolment> FindCoursesForStudent(Student student) { 
     return from enrolment in Enrolments 
       where enrolment.studentId == student.id 
       group enrolment by enrolment.courseId into gp 
       select gp.OrderBy(e => e.enrolmentDate).First(); 
    } 

Est-ce ce que vous demandez?