如何从与Linq的多对多关系中找回同学

时间:2014-01-25 00:20:05

标签: sql asp.net-mvc ef-code-first

我首先使用EF6代码和MVC 5.我有两个模型类,它们之间具有多对多的关系。 EF还为我生成了一个联结表,其中包含Student和Course表的外键。

public class Student
{
    public int StudentId { get; set; }
    public string Name { get; set; }
    public ICollection<Course> Courses { get; set; } 
}

public class Course
{
    public int CourseId { get; set; }
    public string Title { get; set; }
    public ICollection<Student> Students { get; set; } 
}

对于“学生A”,我想列出在“学生A”中注册相同课程或同等学历的同学。如果学生在“课程A”和“课程B”中注册,在我的行动方法中,如何从StudentId获得在“课程A”和“课程B”中注册的学生列表?

我搜索了很多但找不到任何具体答案。任何帮助都会很棒。

1 个答案:

答案 0 :(得分:1)

在纯SQL中,这可以通过将联结表与自身交叉连接然后过滤结果行来完成:

select distinct sc2.[StudentId]
from StudentsCourses sc1
cross join StudentsCourses sc2
where sc1.[StudentId] = 12345 and sc1.[CourseId] = sc2.[CourseId]

实体框架不允许访问StudentsCourses表,但您可以尝试使用以下C#代码模拟此类交叉连接:

from sc1 in (db.Students.SelectMany(s1 => s1.Courses.Select(c1 => new { Student = s1, Course = c1 })))
from sc2 in (db.Students.SelectMany(s2 => s2.Courses.Select(c2 => new { Student = s2, Course = c2 })))
where sc1.Student.StudentId == 12345 && sc1.Course.CourseId == sc2.Course.CourseId
select sc2.Student;

但是我不确定EF是否会有效地生成SQL,所以你应该使用SQL profiler来检查它。可能最好将ExecuteQuery方法与字符串一起使用。