Пример, приведенный в в блоге есть следующее
from e in s.StudentCourseEnrollments where courseIDs.Contains(e.Course.CourseID) select e
Логика contains не будет работать, когда мы ищем точное совпадение. Если студент записался на 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