web-dev-qa-db-fra.com

DataTable Group Group par

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?

13
Greg

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);
26
adatapost
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);
12
Rango

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();
1
Ashfaq Shaikh