我有以下 SQL 查询:
SELECT
s.name, count(sc.id) AS classes
FROM
students s
LEFT JOIN studentsclasses sc ON s.id = sc.studentid
GROUP BY s.name
HAVING count(sc.id) = 0
ORDER BY count(sc.id);
该查询获取学生类(class)数并返回类(class)最少的学生。
如何将其转换为 C#?我的尝试没有产生预期的结果。我有:
var query = (from students in ent.Students
join classes in ent.StudentsClasses on students.ID equals classes.StudentID into gj
from subpet in gj.DefaultIfEmpty()
select new { students.Name }).ToList();
然而,这会返回在类(class)中注册的所有学生的所有姓名。
================================
这是表格:
==================
StudentsClasses
----------------
ID (Registration ID of the class)
StudentID (ID of student taking class)
ClassID (ID of certain class)
----------------
==================
Students
---------------
ID (ID of student)
Name (Name of student)
GradeLevelID (Grade of student)
---------------
==================
最终查询
var query = (from students in ent.Students
join classes in ent.StudentsClasses on students.ID equals classes.StudentID into gj
from subpet in gj.DefaultIfEmpty()
orderby students.StudentsClasses.Count
where students.StudentsClasses.Count == 0
select new { students.Name }).ToList();
最佳答案
编辑:固定语句
IEnumerable<IGrouping<Student, Student>> query = from student in ent.Students
join studentClass in ent.StudentClasses on student.Id equals studentClass.StudentId into studentClassesJ
from studentClass in studentClassesJ.DefaultIfEmpty()
group student by student
into studentGroup
select studentGroup;
IEnumerable<Student> result = query.Where(x => x.Count() == query.Min(y => y.Count())).Select(x => x.Key);
请注意,尽管您声明您的 SQL 查询将返回上课次数最少的学生,但由于 HAVING count(sc.id) = 0,您的 SQL 仅返回根本没有类的用户
。
我提供的 LINQ
语句没有被过滤,而只是按类的数量排序,但您应该能够使用所需的过滤来扩展它。
关于c# - 将 SQL 查询转换为 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29869076/