【问题标题】:Efficient DataTable Group By高效的 DataTable 分组方式
【发布时间】:2012-01-18 07:27:13
【问题描述】:

我想对 DataTable 执行聚合查询以创建另一个 DataTable。我无法更改用于创建初始 DataTable 的 SQL。

原始数据表:(一切都是 int)

TeamID | MemberID
-------|-----------
1      | 1
1      | 2
1      | 3
2      | 4
2      | 5

想要的结果:

TeamID | MemberIDCount
-------|--------------
1      | 3
2      | 2

如果是 SQL,我可以这样做

Select TeamID, Count(*) From Table Group By TeamID

但在我的应用程序中,我知道如何处理此问题的唯一方法是:

Dictionary<int,int> d = new Dictionary<int,int>();
foreach (DataRow dr in dt.Rows)
{
    if (d.ContainsKey(dr.ID))
    {
        d[dr.ID] = d[dr.ID] + 1;
    }
    else
    {
        d.Add(dr.ID, 1);
    }
}

有没有更好的办法?

【问题讨论】:

    标签: c# asp.net datatable


    【解决方案1】:

    你可以使用 Linq。

    var result = from row in dt.AsEnumerable()
                  group row by row.Field<int>("TeamID") into grp
                   select new
                     {
                     TeamID = grp.Key,
                      MemberCount = grp.Count()
                      };
     foreach (var t in result)
         Console.WriteLine(t.TeamID + " " + t.MemberCount);
    

    【讨论】:

      【解决方案2】:
      public DataTable GroupBy(string i_sGroupByColumn, string i_sAggregateColumn, DataTable i_dSourceTable)
      {
      
          DataView dv = new DataView(i_dSourceTable);
      
          //getting distinct values for group column
          DataTable dtGroup = dv.ToTable(true, new string[] { i_sGroupByColumn });
      
          //adding column for the row count
          dtGroup.Columns.Add("Count", typeof(int));
      
          //looping thru distinct values for the group, counting
          foreach (DataRow dr in dtGroup.Rows) {
              dr["Count"] = i_dSourceTable.Compute("Count(" + i_sAggregateColumn + ")", i_sGroupByColumn + " = '" + dr[i_sGroupByColumn] + "'");
          }
      
          //returning grouped/counted result
          return dtGroup;
      }
      

      例子:

      DataTable desiredResult = GroupBy("TeamID", "MemberID", dt);
      

      【讨论】:

        【解决方案3】:

        LINQ 中的分组方式

        var listInfo = (from infoMember in context.Members
                        where infoMember.TeamID  == TeamID 
                        group infoMember by new
                        { infoMember.TeamID, infoMember.MemberIDCount } into newInfoMemeber
                        select new ClassName
                        {
                           TeamID = newInfo.Key.TeamID,
                           MemberIDCount = newInfo.Key.MemberIDCOunt,
                           Count = newInfo.Count(),
                           TotalCount = (from infoMemeber2 in context.Members
                                         where infoMemeber2.TeamID== TeamID
                                         select infoResult2).Count()
                        }).AsEnumerable();
        

        【讨论】:

          猜你喜欢
          • 2010-11-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多