2011-04-20 70 views
1

我的数据结构,建立这样LINQ查询内部串联列表

  • 用户需要多个模块的
  • 模块包含了一些课程

这里是如何的关系看起来像: enter image description here

如何获得用户所需的课程列表?

查询我现在是:

var courses = (from ClassEnrollment enrolment in entities.ClassEnrollment 
         where enrolment.UserID == UserID 
         join Module module in entities.Module 
         on enrolment.ModuleID equals module.ID 

         select module.Course 
        ).ToList(); 

然而,这不会导致课程列表,而是课程列表清单。

我该如何将这个查询展平到不同的课程列表中?

回答

1

事情是这样的:

var courses = from ClassEnrollment enrolment in entities.ClassEnrollment 
       from module in entities.Module 
       where enrolment.ModuleID equals module.ID && enrolment.UserID equals UserID 
       select module.Course 
+0

与我原来的查询有什么不同? – Extrakun 2011-04-20 12:30:02

+0

@Extrakun:因为它在引擎盖下使用了“SelectMany”,所以它应该使结果变平。 – volpav 2011-04-20 13:00:07

+0

谢谢,我设法发现差异。我会试试看。 – Extrakun 2011-04-20 13:35:43

1

可以使用

courses.SelectMany(C => C);

在你的查询,你并不需要显式指定类型的范围变量

或者你可以加入课程查询

var query = from enrolment in entities.ClassEnrollment 
      join module in entities.Module on enrolment.ModuleID equals module.ID 
      join course in entities.Course on module.CourseID equals course.ID 
      where enrolment.UserID == UserID 
      select course; 

var course = query.ToList(); 
+0

模块没有courseID,它具有导航属性EF内部的课程是模块与之关联的课程列表。 – Extrakun 2011-04-20 12:30:50

2

根据您的数据结构屏幕截图,您在ClassEnrollmentModule之间有一对多关系,以及称为的导航属性。您还有ModuleCourse之间的多对多关系,但导航属性应该被称为Courses。鉴于你的代码,你想是这样的:

var courses = entities. 
       ClassEnrollment. 
       Where(e => e.UserID == UserID). 
       SelectMany(e => e.Module.Courses). 
       ToList(); 

你的问题,但是,提到了一个用户:A user takes a number of modulesHow do I get a list of courses the user takes?。但是,我没有在其他任何地方看到任何用户实体,所以如果你能澄清,这将是很好的。你使用LINQ到SQL,顺便说一句?

+0

我正在使用实体框架。我没有在ClassEnrollment和User之间添加关联,所以我没有在我的屏幕截图中包含它。现在想起来,我想我应该加入这个协会。 – Extrakun 2011-04-20 12:25:49