2013-05-06 52 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