2014-02-11 39 views
1

我想在C#中構建一個LINQ查詢,它會給我一個數據集中列的不同值列表,併爲每行計數。結果看起來像這樣。不同計數的LINQ查詢

State Count 
AL  55 
AK  40 
AZ  2 

這是執行該操作的SQL。

SELECT name, COUNT(*) AS count 
    FROM architecture arch 
    GROUP BY name 
    ORDER BY name 

我已經找到了LINQ來獲取DISTINCT值。

var query = ds.Tables[0].AsEnumerable() 
    .OrderBy(dr1 => dr1.Field<string>("state")) 
    .Select(dr1 => new {state = dr1.Field<string>("state")}) 
    .Distinct().ToList(); 

但我無法弄清楚如何讓每個不同的值的COUNT(*)在LINQ中工作。任何想法如何將它添加到LINQ查詢?

回答

4

你需要將你的成果基礎上State和從象羣的select count:

var query = ds.Tables[0].AsEnumerable() 
      .GroupBy(r => r.Field<string>("state")) 
      .Select(grp => new 
          { 
           state = grp.Key, 
           Count = grp.Count() 
          }) 
      .OrderBy(o => o.state) 
      .ToList(); 
+0

丟失或但我打敗了我:) –

+0

@SergeyBerezovskiy,謝謝你的命令:) – Habib

1

爲什麼有Distinct麻煩,當您可以將SQL查詢轉換爲LINQ幾乎字對字?你可以這樣做:

var query = ds.Tables[0].AsEnumerable() 
    .GroupBy(dr1 => dr1.Field<string>("state")) 
    .Select(g => new { 
     State = g.Key 
    , Count = g.Count() 
    }) 
    .OrderBy(p => p.State) 
    .ToList(); 

這產生一對{State, Count}對的列表。如果你喜歡態 - 計數的字典,你可以改變你的查詢是這樣的:

var query = ds.Tables[0].AsEnumerable() 
    .GroupBy(dr1 => dr1.Field<string>("state")) 
    .ToDictionary(g => g.Key, g => g.Count()); 
+0

我認爲你需要'AsEnumerable()'爲'DataTable' – user2711965

+0

@NewHire你是對的,他的'dr1.Field (「state」 )'可能與'IQueryable '不兼容。感謝您的評論! – dasblinkenlight

+0

我認爲這就是拋棄我思考我需要在那裏獨特。謝謝。 – John81

1

我想你需要的GroupBy

var query = ds.Tables[0].AsEnumerable() 
       .GroupBy(dr1 => dr1.Field<string>("state")) 
       .Select(g => new {state = g.Key, count = g.Count()) 
       .ToList(); 
0
var query = ds.Tables[0].AsEnumerable() 
       .GroupBy(x=>x.Field<string>("state")) 
       .Select(g => new{ 
        state = g.Key, 
        count = g.Count() 
       }); 
2

組中的所有行通過狀態值欄。然後通過分組鍵來訂購組。而最後一步 - 項目各組與組鍵(州)和行計數組匿名對象:

var query = ds.Tables[0].AsEnumerable() 
       .GroupBy(r => r.Field<string>("state")) 
       .OrderBy(g => g.Key) 
       .Select(g => new { State = g.Key, Count = g.Count() }) 
       .ToList(); 

查詢語法看起來像(我將跳過轉換列出,以避免混合語法):

var query = from r in ds.Tables[0].AsEnumerable() 
      group r by r.Field<string>("state") into g 
      orderby g.Key 
      select new { 
       State = g.Key, 
       Count = g.Count() 
      }; 
0

你猜怎麼着,的group by相當於是group by :)

 var query = from dr1 in ds.Tables[0].AsEnumerable() 
        group dr1 by dr1.Field<string>("state") into state 
        select new { State = state.Key, Count = state.Count() }; 
0
var stat = from row in ds.Tables[0].AsEnumerable() 
group row by new 
{ 
    Col1 = row["Name"], 
} into TotalCount 
select new 
{ 
    ActionName = TotalCount.Key.Col1, 
    ActionCount = TotalCount.Count(), 
};