2012-12-12 62 views
1

我期待有一個非常簡單的解決方案,但我不能爲我的生活想出解決辦法...與計數(擴展方法)Linq查詢

我試圖創建LINQ相當於此:

SELECT Group, COUNT(*) as GroupCount 
FROM table1 
WHERE Valid > 0 
GROUP BY Group, Project 

我有這個至今:

var model = _db.table1 
    .Where(r => r.Valid > 0) 
    .GroupBy(r => new { r.GROUP, r.Project}) 
    .Select(r => new{ r.GROUP, GroupCount = r.count()}; 

什麼是錯我的查詢? Visual Studio的罰球和錯誤,指出:

System.Linq.IGrouping」不包含定義‘集團’,沒有擴展方法‘集團’接受一個類型的第一個參數‘System.Linq.IGrouping’可能找到(是否缺少using指令或程序集引用?)

編輯:只是一個注:Select子句中給出了r.Group上述錯誤。

它也會拋出一個錯誤,指出count擴展方法不存在,但我已經看到其他例子以這種方式完成。也許我在看一個來自舊版LINQ的例子嗎?

EDIT2:一些示例性數據

GroupName ProjectID Step Other Info... 
----------------------------------------------- 
GroupA  |  1  | 1 | .............. 
GroupA  |  1  | 2 |.............. 
GroupA  |  3  | 1 | .............. 
GroupB  |  4  | 1 | .............. 
GroupB  |  5  | 1 | .............. 
GroupC  |  6  | 1 |.............. 

期望的結果:

GroupName Group Count 
--------------------------- 
GroupA  |  2 
GroupB  |  2 
GroupC  |  1 
+0

'.count'應該是'.Count()',它區分大小寫... –

+0

DOH!這個問題是固定的。謝謝 – Jeff

+1

你可能想選擇組中的鍵:'.Select(r => new {r.GROUP,GroupCount = r.count()};'應該是'.Select(r => new {r。 Key,GroupCount = r.Count()};' –

回答

2

嗯,你已經在.Select聲明以下錯誤:

  • .count應該.Count(C#是區分大小寫)
  • r.GROUPr.Keyr.Key.GROUP(.GroupBy()返回一個IGrouping<TKey, TElement>
  • 您忘記了Select方法中的最後一個圓括號。(但也許這只是在本例中一個錯字)

結果:

var model = _db.table1 
    .Where(r => r.Valid > 0) 
    .GroupBy(r => new { r.GROUP, r.Project }) 
    .Select(r => new { r.Key.GROUP, GroupCount = r.Count() }); 

UPDATE:

的意見和問題,更新後;它看起來像你只按組進行分組,這樣就會在轉向這樣的事情,獲得​​您所需的輸出:

var model = _db.table1 
    .Where(r => r.Valid > 0) 
    .GroupBy(r => new { r.GROUP }) // First, group only on GROUP 
    .Select(r => new 
    { 
     r.Key.GROUP, 
     // Second, group on unique ProjectId's 
     GroupCount = r.GroupBy(g => g.Project).Count() 
    }); 

或簡化:

var model = _db.table1 
    .Where(r => r.Valid > 0) 
    .GroupBy(r => r.GROUP) // First, group only on GROUP 
    .Select(r => new 
    { 
     Group = r.Key, 
     // Second, group on unique ProjectId's 
     GroupCount = r.GroupBy(g => g.Project).Count() 
    }); 

當您在評論中問道,是的,你可以說這些值是在GroupBy子句中連接的。所以new { r.GROUP, r.Project }會將所有對組合在一起。

+0

這可行,但似乎產生意想不到的結果。我的意圖是收集分配給每個唯一'Group'的唯一'Project'的數量。我的'GroupCount'每行最終爲1。我想知道它是否與'r.Key.Group'有關... 編輯:看起來我應該使用'r.Project.Count()'或'r.Key,Project.Count()'。 – Jeff

+0

@Jeff我用一些模擬數據進行了測試,它適用於我,但也許我誤解了你。你能舉一個你有數據和輸出應該是什麼的例子嗎? –

+0

我在問題中添加了示例數據。 – Jeff

1

LINQ查詢是大小寫敏感的。您正嘗試訪問r.GROUP,這可能不存在。改爲使用r.Group。還將r.count()更改爲r.Count()。下面是更正後的代碼:

var model = _db.table1 
    .Where(r => r.Valid > 0) 
    .GroupBy(r => new { r.Group, r.Project}) 
    .Select(r => new{ r.Key, GroupCount = r.Count()}; 
+3

不回答他的其他錯誤 – IronMan84

+0

@ IronMan84不是嗎?你是指哪一個?我想如果他用'r.Group'替換了對'r.GROUP'的引用,就像我一樣在我的例子中,它可能會解決OP的問題 –

+0

他的組錯誤並不是因爲區分大小寫,這是因爲他需要t o使用r.Key。 – IronMan84

0

當你在做GROUP BY,你要創建一個新的匿名類型(不是你認爲它是類型)。因此,當你執行select語句時,它不知道什麼是GROUP。

要解決這個問題,請按照第二個答案located here