1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

GroupBy後、集計しない列?の取り出し

Last updated at Posted at 2017-12-03

##やりたい事
DataTableの特定列をグループ化してSumしたレコードを取り出ししたい

##前提
DataTable tableを.AsEnumerable()し、GroupByした。
列構成(例)
Hoge1Code(String)
Hoge1Name(String)
Hoge2Code(String)
Hoge2Name(String)
Fuga1(Decimal)
Fuga2(Decimal)

##失敗例

            var rt = table.AsEnumerable()
                .GroupBy(row => new {
                    hoge1Code= row.Field<string>("Hoge1Code") 
                    ,hoge2Code= row.Field<string>("Hoge2Code")

そして

            var rv =rt.ToList().Select(x =>
            {
            hoge1Name=x.Select(y => y["Hoge1Name"].ToString());
            Fuga2Sum=x.Sum(y => (Decimal)y["Hoge1Name"]);
            }

とすると

System.Linq.Enumerable+WhereSelectListIterator
となる。

##成功例

            var rt = table.AsEnumerable()
                .GroupBy(row => new {
                    hoge1Code= row.Field<string>("Hoge1Code") 
                    ,hoge1Name= row.Field<string>("Hoge1Name")
                    ,hoge2Code= row.Field<string>("Hoge2Code")
                    ,hoge2Name= row.Field<string>("Hoge2Name")

として

            var rt = table.AsEnumerable()
                .GroupBy(row => new {
                    row.Key.hoge1Name
以後略

とした。

##考察
SQLに置き換えて考える

select hoge2Code from 
(select 'aa' as hoge1Code ,'bb' as hoge2Code ,0 as 'cc') as t
group by hoge1Code

とすると
列 't.hoge2Code' は選択リスト内では無効です。この列は集計関数または GROUP BY 句に含まれていません。
てーのと同じだよね?

##補足など
記念すべき初投稿である。
LINQはなんどかチャレンジしたが身につけられていない。お恥ずかしい限り。

1
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?