2009-04-16 62 views
2

如果我有这3类:LINQ - 分组和聚集

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

然后使用此:

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

我可以列出所有学生被录取的课程。

但是,如果一个学生不止一次注册了一门课程,我将如何显示每门课程的最新注册?

我假设我需要按课程进行分组,并过滤​​enrolmentDate = Max(enrolmentDate)或类似的地方?

(如果这看起来很熟悉,那是因为这是一个后续从我previous LINQ question。)

回答

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

为了获得最新的招生每门课程的学生已经采取了,我会使用类似:

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

这就是你要求的吗?