2012-02-08 56 views
2

我是linq新手。 在c#中,我正在做如下,以獲得一列的計數。如何使用linq中的group by子句計算表列的計數

SELECT DispatcherName, 
     ActivityType, 
     CONVERT(BIGINT,COUNT(ActivityType)) AS Total 
FROM  ACTIVITYLOG 
GROUP BY DispatcherName, 
     ActivityType 
ORDER BY Total DESC 

任何一個可以告訴男,我怎麼能使用LINQ實現同樣的事情。

更新:

HI我做了如下,並得到了reslut。 但我無法將結果轉換爲數據表。 這就是我的做法。 這裏dt是包含兩列Dispatchername和ActivityType的datatabe。

var query1 = from p in dt.AsEnumerable() 
          group p by new 
          { 
           DispatcherName = p.Field<string>("Dispatchername"), 
           Activity = p.Field<string>("ActivityType"), 
          } 
           into pgroup 
           let count = pgroup.Count() 
           orderby count 
           select new 
           { 
            Count = count, 
            DispatcherName = pgroup.Key.DispatcherName, 
            Activity = pgroup.Key.Activity 
           }; 

請儘快幫我解決。

+0

http://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b – 2012-02-08 13:43:54

回答

1

如果您希望將結果返回給DataTable,則一種選擇是使用CopyToDataTable方法。

這裏是一個活生生的例子:http://rextester.com/XHX48973

這種方法基本上需要你爲了使用它的方法NewRow創建一個虛擬表 - 創建一個DataRow,這是由CopyToDataTable需要的唯一途徑。

var result = dt.AsEnumerable() 
    .GroupBy(p => new { 
      DispatcherName = p.Field<string>("DispatcherName"), 
      Activity = p.Field<string>("ActivityType")}) 
    .Select(p => { 
     var row = dummy.NewRow(); 
     row["Activity"] = p.Key.Activity; 
     row["DispatcherName"] = p.Key.DispatcherName; 
     row["Count"] = p.Count(); 
     return row; 
    }) 
    .CopyToDataTable(); 

也許有更好的方式可能只需填寫直接行,通過轉換爲List<T>,然後使用ForEach

DataTable dummy = new DataTable(); 
dummy.Columns.Add("DispatcherName",typeof(string)); 
dummy.Columns.Add("Activity",typeof(string)); 
dummy.Columns.Add("Count",typeof(int)); 

dt.AsEnumerable() 
    .GroupBy(p => new { DispatcherName = p.Field<string>("DispatcherName"), 
     Activity = p.Field<string>("ActivityType")}) 
    .ToList() 
    .ForEach(p => { 
     var row = dummy.NewRow(); 
     row["Activity"] = p.Key.Activity; 
     row["DispatcherName"] = p.Key.DispatcherName; 
     row["Count"] = p.Count(); 
     dummy.Rows.Add(row); 
    }); 

活生生的例子:http://rextester.com/TFZNEO48009

+0

非常感謝。你能告訴我請問如何按count desc命令排序結果? – Ram 2012-02-08 14:45:58

+0

@Ram在這裏你去http://msdn.microsoft.com/en-us/library/bb546145.aspx – 2012-02-08 14:57:00

0

這應該做的伎倆:

IList<ACTIVITYLOG> allActivityLogs; 
      var result = (from c in allActivityLogs 
          select new 
          { 
           DispatcherName = c.DispatcherName, 
           ActivityType = c.ActivityType, 
           Total = c.ActivityType.Count 
          }).OrderByDescending(x => x.Total) 
         .GroupBy(x => new { x.DispatcherName, x.ActivityType }); 

你只需要你的實體的實際收集來替代allActivityLogs集合。

+1

我不認爲這會「這樣的伎倆」對於初學者來說是什麼讓你覺得他的'ActivityType'屬性有一個'Count'? – Jamiec 2012-02-08 13:59:40

5
from c in ACTIVITYLOG 
group c by new {c.DispatcherName, c.ActivityType} into g 
orderby g.Count() descending 
select new { g.Key.DispatcherName, g.Key.ActivityType, Total = g.Count() } 
+1

高手。 +1我還在學習LINQ,在這種情況下使用「新」關鍵字真棒。 + woot – 2012-02-08 14:01:30

相關問題