2013-11-01 93 views
1

我有以下SQL的正常工作獲取使用LINQ計數到SQL

SELECT 
    f.ForumId, 
    f.Name, 
    COUNT(ft.TopicId) AS TotalTopics, 
    COUNT(fm.MessageId) AS TotalMessages 
FROM 
    tblForumMessages fm INNER JOIN 
    tblForumTopics ft ON fm.TopicId = ft.TopicId RIGHT OUTER JOIN 
    tblForums f ON ft.ForumId = f.ForumId 
GROUP BY f.ForumId, f.Name 

,我試圖轉換到LINQ。

這裏就是我有

var forums = (from f in Forums 
       join ft in ForumTopics on f.ForumId equals ft.ForumId into topics 
       from y in topics.DefaultIfEmpty() 
       join fm in ForumMessages on y.TopicId equals fm.TopicId into messages 
       from x in messages.DefaultIfEmpty() 
       select new { f.ForumId, f.Name, y.TopicId, x.MessageId } into x 
       group x by new { x.ForumId, x.Name } into g 
       select new 
        { 
         ForumId = g.Key.ForumId, 
         ForumName = g.Key.Name, 
         TopicCount = g.Count(i => i.TopicId), 
         MessageCount = g.Count(i => i.MessageId) 
        } 
       ).ToList(); 

我得到一個錯誤的TopicCount = g.Count(i => i.TopicId)說無法將表達式類型「的System.Guid」返回「BOOL」類型。

我錯過了什麼使這項工作?

感謝

*編輯*

感謝Rob我得到它的工作,但計數總是返回1主題數和留言數,即使沒有記錄。兩者都應該返回0。

我已經改變

select new { f.ForumId, f.Name, y.TopicId, x.MessageId } into x 

select new 
{ 
    f.ForumId, f.Name, 
    TopicId = y != null ? y.TopicId : (Guid?)null, 
    MessageId = z != null ? z.MessageId : (Guid?)null 
} into x 

而對於實際計數修改查詢,我改變了查詢

select new 
{ 
    g.Key.ForumId, 
    g.Key.Name, 
    TopicCount = g.Count(t => t.TopicId != null), 
    MessageCount = g.Count(t => t.MessageId != null) 
} 

回答

2

有問題的文章是TopicCount = g.Count(i => i.TopicId)Count方法需要Func<T, bool>(它給出集合中滿足謂詞的項目數量)。

它看起來像你想在你的組中不同TopicId s的數量。嘗試用TopicCount = g.GroupBy(i => i.TopicId).Count()替換TopicCount = g.Count(i => i.TopicId)

0

您也可以試試TopicCount = g.Select(i => i.TopicId).Distinct().Count()