2011-12-12 63 views
12

我想对DataTable执行一个聚合查询来创建另一个DataTable。我无法更改用于创建初始DataTable的SQL。高效DataTable组通过

原始数据表:(一切都是一个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); 
    } 
} 

有没有更好的方法?

回答

26

您可以使用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); 
+0

1为使用'System.Data.DataSetExtensions'组件。 – Oliver

+1

很好用!谢谢! –

12
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); 
1

组通过在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();