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

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

db<>Fiddle

参考方案

您可以通过这种简单的方式来实现它,实时演示here

假设您通过这种方式获得了入学名单

var enrollments  = from s in dc.Students
                   from c in s.Courses
                   select new { StudentID = s.StudentID, CourseID = c.CourseID };

然后通过这种方式获得结果

    var groupedEnrollment = enrollments.GroupBy(p => p.StudentId)
                                        .Select(g => new 
                                        {
                                            StudentId = g.Key,
                                            Courses = g.Select(p => p.CourseId).ToArray() 
                                        });
    var result = groupedEnrollment.Where(g => 
                                         g.Courses.Length == courses.Length && 
                                         g.Courses.Intersect(courses).Count() == courses.Length);

.NET Core 3 / EF.Core 3:QueryModelGenerator,RelationalQueryModelVisitor等发生了什么 - c#

我想知道发生了什么事:QueryModelGenerator,RelationalQueryModelVisitor和queryCompilationContext.CreateQuerymodelVisitor()似乎都消失了。我有以下代码,但无法尝试将其从2.2转换为.NET Core 3public static string ToSql<TEn…

为什么EF Core 2.2的默认主键设置为nvarchar(450) - c#

我们将代码库从EF6.2升级到EF Core 2.2,我们的团队发现基于字符串的身份密钥的默认值将生成带有以下内容的主键列:EF 6.2(SQL Server)中的nvarchar(128)EF Core 2.2(SQL Server)中的nvarchar(450)做出此决定的原因是什么? 参考方案 SQL Server允许索引最大为900字节。 nvarc…

ASP.NET Core Singleton实例与瞬态实例的性能 - c#

在ASP.NET Core依赖注入中,我只是想知道注册Singleton实例是否会比注册Transient实例更好地提高性能?在我看来,对于Singleton实例,创建新对象和相关对象只需花费一次时间。对于Transient实例,此成本将针对每个服务请求重复。因此Singleton似乎更好。但是,在Singleton上使用Transient时,我们可以获得多…

如何在ASP.NET Core Web应用程序中增加JSON反序列化MaxDepth限制 - c#

我们正在将ASP.NET Core 2.1与.NET Framework 4.6.2结合使用。我们有一个客户需要向我们的Web应用程序发送一个很大程度上嵌套的json结构。当他们进行此调用时,我们将输出以下日志并返回错误: 读取器的MaxDepth超过了32。路径“ super.long.path.to property”,第1行,位置42111。”我浏览了…

ASP.NET Core-在Singleton注入上存储库依赖项注入失败 - c#

我正在使用SoapCore为我的ASP.NET Core MVC应用程序创建Web服务。我正在使用Entity Framework Core和简单的存储库模式来获取我的数据库数据。我通过Startup.cs中的.AddSingleton()注入存储库类:services.AddSingleton<IImportRepository, ImportRep…