【发布时间】:2020-04-24 12:39:32
【问题描述】:
the blog中给出的例子有如下
from e in s.StudentCourseEnrollments where courseIDs.Contains(e.Course.CourseID) select e
当我们寻找完全匹配时,包含逻辑将不起作用。如果学生注册了 6 门课程(例如:1,2,3,4,5,6)并且请求的列表包含 5(例如:1,2,3,4,5),则查询将返回匹配项不应该。当学生注册了请求列表的子集时,另一种方法效果很好。
以下解决方案有效,但需要帮助将以下 sql 转换为 LINQ (EF Core 3.0)?
Create TABLE dbo.Enrollments (StudentId INT NOT NULL, CourseId INT NOT NULL)
insert into dbo.Enrollments values (1,1)
insert into dbo.Enrollments values (1,2)
insert into dbo.Enrollments values (1,3)
insert into dbo.Enrollments values (1,4)
insert into dbo.Enrollments values (1,5)
insert into dbo.Enrollments values (1,6)
DECLARE @TempCourses TABLE
(
CourseId INT
);
INSERT INTO @TempCourses (CourseId) VALUES (1), (2), (3),(4),(5);
SELECT t.StudentId
FROM
(
SELECT StudentId, cnt=COUNT(*)
FROM dbo.Enrollments
GROUP BY StudentId
) kc
INNER JOIN
(
SELECT cnt=COUNT(*)
FROM @TempCourses
) nc ON nc.cnt = kc.cnt
JOIN dbo.Enrollments t ON t.StudentId = kc.StudentId
JOIN @TempCourses n ON n.CourseId = t.CourseId
GROUP BY t.StudentId
HAVING COUNT(*) = MIN(nc.cnt);
drop table dbo.Enrollments
【问题讨论】:
标签: c# linq entity-framework-core ef-core-3.0