Gre*_*reg 13 c# asp.net datatable
我想在DataTable上执行聚合查询以创建另一个DataTable.我无法改变用于创建初始DataTable的SQL.
原始DataTable :(一切都是int)
TeamID | MemberID
-------|-----------
1 | 1
1 | 2
1 | 3
2 | 4
2 | 5
Run Code Online (Sandbox Code Playgroud)
期望的结果:
TeamID | MemberIDCount
-------|--------------
1 | 3
2 | 2
Run Code Online (Sandbox Code Playgroud)
如果它是SQL我可以做
Select TeamID, Count(*) From Table Group By TeamID
Run Code Online (Sandbox Code Playgroud)
但在我的应用程序中,我知道如何处理这个的唯一方法是这样的:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
有没有更好的办法?
ada*_*ost 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);
Run Code Online (Sandbox Code Playgroud)
Tim*_*ter 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;
}
Run Code Online (Sandbox Code Playgroud)
例:
DataTable desiredResult = GroupBy("TeamID", "MemberID", dt);
Run Code Online (Sandbox Code Playgroud)