2

我正在尝试将此 sql 查询写入 Linq:

SQL:

select c.course_name, count(s.s_name) as studenti from course c 
join study_group g on g.course_id=c.id 
join student s on s.study_group_id=g.id 
group by c.course_name;

林克:

var countStudents = (from s in ado.student //on g.id equals s.study_group_id
                     join g in ado.study_group on s.study_group_id equals g.id
                     join c in ado.course on g.course_id equals c.id
                     group s by c.course_name into cn
                     let count = cn.Count(co => co.s_name)
                     select new 
                     {
                        c.course_name
                        course_name = cn.Key
                     });

我仍然有一个错误co => co.s_name

错误:Cannot implicitly convert type 'string' to 'bool'

知道任何人如何解决这个问题吗?

谢谢你。

4

2 回答 2

7

SQLCOUNT(column)聚合函数只计算非空值。LINQ 中的等效项是替换以下行:

let count = cn.Count(co => co.s_name)  

经过

let count = cn.Count(co => co.s_name != null)  

当然,这里不能保证生成的 SQL。不管怎样,一个学生的名字可能为空是很奇怪的,尽管我无意讨论你的模型。

注意
您将无法检索所需的计数,除非您select在代码中使用它。另外,请检查学生的姓名是否可以为空,因为如果他们不能,只需 acn.Count()就足够了。

于 2013-05-06T02:24:27.840 回答
3

为什么Count在 LINQ 语句中需要该子句?只需使用从查询返回的.Count()扩展方法来获取计数。IEnumerable

var count = countStudents.Count();
于 2013-05-06T01:41:54.690 回答