高效的数据表组
我想在DataTable上执行一个聚合查询来创build另一个DataTable。 我无法改变用于创build初始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); } }
有没有更好的办法?
你可以使用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();