2009-04-15 3 views
2

Я просмотрел 101 Linq Samples here, но я не вижу ничего подобного в этом списке. Если я просто не вижу там соответствующего примера, напишите ссылку на него.LINQ - объединение нескольких списков

Если у меня есть эти 3 класса:

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

Как бы использовать LINQ, чтобы получить список курсов студент зачисленных на? (Предположим, что у меня есть IList всех трех классов)

ответ

10

Как насчет:

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; 
} 
0
var courses = (from course in courseList 
    join enr in enrolmentList on enr.courseId equals course.id 
    where enr.studentId = <student id variable> 
    select course); 
+1

Более эффективно делать то, что * перед * соединением - нет смысла сопоставлять загрузку с курсами в соединении, чтобы сразу же выбросить их. –

+0

Кажется, что LINQ нужен лучший оптимизатор, тогда;) –

1

не явный ответ, но, возможно, неявно полезно строить свою систему.

Рассматривали ли вы богаче модель предметной области, так как:

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

?

Класс Студент мог тогда иметь метод GetEnroledCourses() как так:

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

модель, это просто отображение один к одному в базе данных хватает в некоторых контекстах, но если у вас есть сложный бизнес логика, такая как «anemic domain model» может вас укусить.

Смежные вопросы