c# - EF Core 3.0 - 将 SQL 转换为 LINQ

标签 c# linq entity-framework-core ef-core-3.0

the blog 中给出的示例有以下内容

from e in s.StudentCourseEnrollments where courseIDs.Contains(e.Course.CourseID) select e 

当我们寻找精确匹配时,包含逻辑将不起作用。如果学生注册了 6 门类(class)(例如:1,2,3,4,5,6)并且请求的列表包含 5 门类(class)(例如: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

db<>Fiddle

最佳答案

我不知道 SQL 查询,但同一任务的 EF Core 3.0 LINQ 查询是这样的:

var matchIds = new[] { 1, 2, 3, 4, 5 }.AsEnumerable();
var query = dbContext.Students
    .Where(s => s.Enrollments.All(e => matchIds.Contains(e.CourseId)) 
        && s.Enrollments.Count() == matchIds.Count());

主要的匹配工作是通过All子查询完成的。不幸的是,这对于相关链接记录多于匹配 ID 的情况来说还不够,因此额外的计数比较可以解决这个问题。

关于c# - EF Core 3.0 - 将 SQL 转换为 LINQ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59621091/

相关文章:

c# - 注册外部登录 Web API

C# - 使用通用枚举(或控制列表的替代方法)

c# - MySqlDataAdapter 与 GroupBy sql 字符串返回空内容

c# - 使用 Entity Framework 添加多个对象时如何获取多个对象的标识?

c# - TypeLoadException : Method 'Create' in type . ..没有实现(错误如下)

c# - EF 核心 : Get Authenticated username in Shadow Properties

c# - 如何判断MemoryCache类消耗了多少内存?

entity-framework - 如何查看 Entity Framework LINQ 查询计划缓存?

linq - Nhibernate 3.2 查询与 QueryOver

c# - 在 EF 上下文中使用 appsettings.json 配置