2013-05-06 49 views
2

我试图写这个SQL查询到LINQ:错误Linq中,COUNT()

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; 

的Linq:

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 
        }); 

,仍然我有错误​​

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

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

谢谢。

+1

请参阅[msdn](http://msdn.microsoft.com/en-us/library/bb535181.aspx) - “Count”期待'Func ',并且要计算返回true的结果。没有超载来计算不同的字符串,因为(我认为)你在这里试图做。不幸的是,我不知道该怎么做,对不起。 – Blorgbeard 2013-05-06 01:41:45

+0

或者,如果有人知道的另一种方式得到这个SQL到LINQ ??,谢谢 – Patrik18 2013-05-06 01:53:16

回答

7

SQL COUNT(column)集合函数只计数非空值。在LINQ相当于将更换线路:由

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

当然,不能保证

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

上生成的SQL这里。无论如何,奇怪的是,一个学生的名字可能是空的,尽管我无意讨论你的模型。


您将无法检索所需的次数,除非你select它在你的代码。此外,请检查学生的姓名是否为空,因为如果他们不能,只需cn.Count()即可。

+0

谢谢你,现在它的工作 – Patrik18 2013-05-06 02:34:01

+0

@ user1726810,请尽管检查你的SQL。你可能应该想通过* courseid *来进行分组,而不是课程名称(除非它们是你课程的唯一标识符)。另外,我强烈地感觉到学生的姓名不能为空,在这种情况下,简单的cn.Count()就足够了。检查你的模型,以便你的SQL清晰简明;它可以帮助您避免将来出现错误。 – 2013-05-06 02:38:35

+0

好的,我会检查一下.. – Patrik18 2013-05-06 02:39:28

3

为什么你需要LINQ语句中的Count子句?只需在您的查询返回的IEnumerable上使用.Count()扩展方法即可获得计数。

var count = countStudents.Count(); 
+0

我必须使用变量,因为我需要计算每次c.course_name的, 只需编辑 – Patrik18 2013-05-06 01:47:23