web-dev-qa-db-ja.com

LINQを使用してDataTableからデータをグループ化します

LINQを使用してDataTableのデータをグループ化したい(列:userid、chargetag、charge)。

コンテンツは次のようになります。

userid    chargetag    charge
-----------------------------
user1     tag3         100
user2     tag3         100
user3     tag5         250

結果として、次のようなものが必要です。

chargetag    count    sum
-------------------------
tag3         2        200
tag5         1        250

これは私がこれまでに持っているものです:

var groupedData = from b in dataTable.AsEnumerable()
                  group b by b.Field<string>("chargetag") into g
                  let count = g.Count()
                  select new
                  {
                      ChargeTag = g.Key,
                      Count = count,
                  };

チャージタグの名前と番号を抽出できます。料金の合計にもアクセスするには、LINQクエリをどのように変更する必要がありますか?

前もって感謝します :-)

よろしく、ケビン

9
bitfrickler

これは非常に簡単です。グループでSum拡張メソッドを使用するだけです。

var groupedData = from b in dataTable.AsEnumerable()
                  group b by b.Field<string>("chargetag") into g
                  select new
                  {
                      ChargeTag = g.Key,
                      Count = g.Count(),
                      ChargeSum = g.Sum(x => x.Field<int>("charge"))
                  };

(実際には何も購入していなかったため、ここでlet句を削除しました。)

さてmay非効率的です; 2つの集計操作を実行するために、2回グループ化される可能性があります。あなたcould本当に必要な場合は、このようなクエリ継続でそれを修正します。

var groupedData = from b in dataTable.AsEnumerable()
                  group b by b.Field<string>("chargetag") into g
                  select new
                  {
                      ChargeTag = g.Key,
                      List = g.ToList(),
                  } into g
                  select new 
                  {
                      g.ChargeTag,
                      Count = g.List.Count,
                      ChargeSum = g.List.Sum(x => x.Field<int>("charge"))
                  };

または、代わりにlet句を使用します。

var groupedData = from b in dataTable.AsEnumerable()
                  group b by b.Field<string>("chargetag") into g
                  let list = g.ToList()
                  select new
                  {
                      ChargeTag = g.Key,
                      Count = list.Count,
                      ChargeSum = list.Sum(x => x.Field<int>("charge"))
                  };
38
Jon Skeet