如何通过 LINQ-to-entities 实现相同的 SQL 行为

问题描述 投票:0回答:2

我的应用程序中有以下两个实体类:

class Attendance
{
  public int Id {get; set;}
  public string StudentName {get; set;}

  // the linked entity
  public SubjectClass SubjectClass {get; set;} = null; // a nullable column in db
}

class SubjectClass
{
  public int Id {get; set;}
  public string Code {get;set;}
}

为了简单起见,我们忽略出勤时间,并假设每当有学生在场时,出勤表中就会有一个条目。我如何获得当前在校学生的

SubjectClass
列表,并按每个班级的学生人数分组。 结果以
List<QueryResult>
DTO 的形式返回,如下所示:

class QueryResult
{
  public int ClassId {get; init;}
  public int ClassCode {get; init;}
  public int PresentStudents {get; init;}
}

我有一个有效的 SQL 查询,如下所示:

SELECT m.Id, m.ClassCode, COUNT(m.ClassId) AS PresentStudents
FROM [SubjectClasses] m 
    INNER JOIN Attendance c ON m.Id = c.Id
GROUP BY m.Id, m.ClassCode

这是一个 .NET 6 应用程序(如果相关)。

c# linq-to-entities
2个回答
0
投票

您可以在 .NET 6 应用程序中使用 LINQ to Entities 实现所需的行为。首先,确保您的应用程序中设置了

DbContext
,其中包含
Attendance
SubjectClass
实体。然后,您可以使用 LINQ to Entities 编写类似于 SQL 查询的查询:

using System.Linq;

// Assuming you have a DbContext instance called "dbContext"
var query = from subjectClass in dbContext.SubjectClasses
            join attendance in dbContext.Attendance on subjectClass.Id equals attendance.SubjectClass.Id
            group subjectClass by new
            {
                subjectClass.Id,
                subjectClass.Code
            } into g
            select new QueryResult
            {
                ClassId = g.Key.Id,
                ClassCode = g.Key.Code,
                PresentStudents = g.Count()
            };

List<QueryResult> results = query.ToList();

0
投票

首先,你的SQL似乎有一个小问题。您正在使用

Attendance.Id = SubjectClasses.Id
条件加入考勤。这似乎不对。您可能应该在
Attendance.SubjectClassId = SubjectClasses.Id
之前加入。这可能应该是这样的:

SELECT m.Id AS CLassId, m.ClassCode, COUNT(m.Id) AS PresentStudents
FROM [SubjectClasses] m 
    INNER JOIN Attendance c ON m.Id = c.SubjectClassId
GROUP BY m.Id, m.ClassCode

以下是在 EF Core 中编写它的方法:

from subcjectClass in _yourContext.SubjcectClasses
join attendance in _yourContext.Attendance
on subjectClass.Id equals attendance.SubjectClassId
group subcjectClass by new { subjectClass.Id, subjectClass.ClassCode } into classGroup
select new QueryResult
{
   ClassId = subjectClass.Id,
   ClassCode = subjectClass.ClassCode,
   PresentStudents = classGroup.Count()
}
© www.soinside.com 2019 - 2024. All rights reserved.