DataTableで集計クエリを実行して、別のDataTableを作成したいと思います。初期DataTableの作成に使用されているSQLを変更することはできません。
元のデータテーブル:(すべてが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();