比较id数组实体框架
本文关键字:框架 实体 数组 id 比较 | 更新日期: 2023-09-27 18:07:48
我有一个简单的场景,我想写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;
但是返回的是那些注册了课程id为1,2,4的学生。希望你能理解我的问题。
谢谢你的帮助
尝试如下:
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;
使用
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 query:
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();
下面是一个例子,使用链接到对象。
编辑:
我没有注意到在你的模型中有一个从Student
到StudentCourse
的导航属性,在这种情况下,查询将简单得多,不需要连接,Patrick的回答工作完美。