如何使用linq中的group by子句计算表列的计数

时间:2012-02-08 13:33:32

标签: asp.net linq

我是linq的新手。 在c#中,我按照以下步骤来计算一列。

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

任何人都可以告诉我,我如何使用LINQ实现同样的目标。

更新

我做了如下并且得到了结果。 但是我无法将结果转换为数据表。 这就是我做的。 这里dt是datatabe,有两列Dispatchername和ActivityType。

 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
                                 };

请尽快帮助我。

3 个答案:

答案 0 :(得分: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)

如果您希望将结果返回给DataTable,则可以选择使用CopyToDataTable方法。

以下是一个实例:http://rextester.com/XHX48973

此方法基本上要求您创建一个虚拟表,以便使用其NewRow方法 - 创建DataTow的唯一方法,这是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

答案 2 :(得分: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集合替换为实体的实际集合。