在这篇博客中给出的示例具有以下特点:
当我们需要查找一个完全匹配时,包含逻辑将不起作用。如果学生已经选修了6门课程(例如:1、2、3、4、5、6),而请求列表中包含5(例如:1、2、3、4、5),则查询将返回匹配,但实际上不应该如此。当学生选择了请求列表的子集时,另一种方法可以很好地运行。
以下解决方案可行,但需要帮助将下面的SQL转换为LINQ(EF Core 3.0)?
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