比较ID实体框架数组

时间:2015-08-13 08:59:25

标签: c# asp.net entity-framework

我有一个简单的场景,我想写LINQ查询,但我无法做到正确。这是场景:

我有3张桌子:

STUDENT:
    --------------------------
    SID   Name
    ---------------------
    1     Jhon
    2     Mishi
    3     Cook
    4     Steven

COURSE:
    -------------------
    CID     Name
    -------------------
    1       Maths
    2       Physics
    3       Bio
    4       CS

STUDENTCOURSE:
    ---------------------------
    SCID   SID   CID
    -----------------------
    1       1     1
    2       1     2
    3       1     4
    4       2     1
    5       2     2
    6       2     3
    7       3     1
    8       3     4
    10      4     2

对于这种情况,我想传递一系列课程ID来查询并返回所有注册了这些课程的学生。我尝试了什么:

 int[] cIds = {1,2,4 };
 var result = from s in context.Students
              where s.StudentCourses.Any(sc=> cIds.Contains(sc.CID))
              select s;

但这会让那些注册了课程编号1,2,4的学生返回。 希望你能理解我的问题。

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

使用此:

int[] cIds = {1,2,4 };
var q = context.StudentCourses.Join(context.Students, 
                                    x => x.SId, 
                                    x => x.Id, 
                                    (sc, s) => new { Student = s, CourseId = sc.CId })
        .GroupBy(x => x.Student.Id)
        .Where(sc => cIds.All(cid => sc.Any(y => y.CourseId == cid)))
        .Select(x => x.FirstOrDefault().Student)
        .ToList();

或者如果您更喜欢linq查询:

int[] cIds = {1,2,4 };
var q2 = (from s in context.Students
          join sc in context.StudentCourses on s.Id equals sc.SId into sCources
          where cIds.All(id => sCources.Any(y => y.CId == id))
          select s).ToList();

这是一个fiddle,使用linq-to-objects。

修改
我没注意到在你的模型中有一个从StudentStudentCourse的导航属性,在这种情况下,查询会更简单,不需要加入,Patrick's回答有效完美。

答案 1 :(得分:1)

尝试以下方法:

int[] cIds = {1,2,4 };
var result = from s in context.Students
             where cIds.All(id => s.StudentCourses.Any(sc=> sc.CID == id))
             select s;