将 SQL 查询转换为 C#

3

我有以下的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);

这个查询获取学生课程数量并返回选修最少的学生。

我该如何将其转换为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();

然而,这将返回所有注册课程的学生姓名。
================================
以下是表格:
==================
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();

这更取决于您的数据模型而不是数据库表。例如,如果在学生类上有一个导航属性指向班级,那么对于每个学生,只需像Student.Classes.Count()这样简单的操作即可 - 更简洁地说,您能否发布一下Student和StudentsClasses的模型类? - jdphenix
1
没有必要,只需添加 orderby students.StudentsClasses.Count 就可以得到正确的输出结果了。谢谢 @jdphenix - J Orgus
1
这肯定可以完成。导航属性是一个很棒的东西 - 往往不需要直接映射 SQL 查询(概念对概念),即,我在 SQL 中看到了一个连接,所以我必须在 LINQ 查询中需要一个连接 - 这并不正确。很高兴我能帮到你。 :) - jdphenix
1个回答

1

编辑:修正陈述

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语句没有过滤,只按课程数量排序,但您应该能够扩展它以实现所需的过滤。

或者,使用导航属性:from student in ent.Students orderby student.Count() select student - jdphenix
我也注意到了,我认为解决这个问题的方法是获取最低计数并将其放入整数中,然后将其作为变量放入查询中。但是到目前为止,我还没有成功将数字0转换为整数。 - J Orgus
@JOrgus 我看到的是对的吗?如果上课最少的学生有3节课,你想要一个查询来返回所有有3节课的学生? - Michael Sander
更正:是的,这就是我想要在我的原始查询中的内容,但是我已经让它工作了,但是WHERE子句明确说明了数字0。我已经编辑了原始帖子,所以您可以看到查询。我想制作一个查询来获取数字0并将其输入到WHERE子句中。@MichaelSander - J Orgus
@JOrgus编辑了查询,希望现在它能够满足您的需求。 - Michael Sander
@MichaelSander 正是我在寻找的。谢谢。 - J Orgus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接