我的应用程序中有以下两个实体类:
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 应用程序(如果相关)。
您可以在 .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();
首先,你的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()
}