Je voudrais effectuer une requête globale sur un DataTable pour créer un autre DataTable. Je ne peux pas modifier le code SQL utilisé pour créer le DataTable initial.
DataTable d'origine: (tout est un int)
TeamID | MemberID
-------|-----------
1 | 1
1 | 2
1 | 3
2 | 4
2 | 5
Résultat désiré:
TeamID | MemberIDCount
-------|--------------
1 | 3
2 | 2
Si c'était SQL je pourrais juste faire
Select TeamID, Count(*) From Table Group By TeamID
mais dans mon application, la seule façon dont je sais comment gérer cela serait quelque chose comme ceci:
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);
}
}
Y a-t-il un meilleur moyen?
Vous pouvez utiliser 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;
}
Exemple:
DataTable desiredResult = GroupBy("TeamID", "MemberID", dt);
Group By dans 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();