高效的数据表分组依据
本文关键字:数据表 高效 | 更新日期: 2023-09-27 18:17:37
我想对一个数据表执行聚合查询以创建另一个数据表。我无法更改用于创建初始数据表的 SQL。
原始数据表:(一切都是整数(
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);
}
}
有没有更好的方法?
你可以使用 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);
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);
在 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();