我想在DataTable上执行聚合查询以创建另一个DataTable。我无法改变用于创建初始DataTable的SQL。
Original 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);
}
}
有更好的方法吗?
答案 0 :(得分: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);
答案 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);
答案 2 :(得分: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();