web-dev-qa-db-ja.com

グループごとに合計するLinqクエリ

次のようなデータテーブルがあります。

Category         Description       CurrentHours      CTDHours  
LC1              Cat One                 5               0  
LC2              Cat Two                 6               0  
LC3              Cat Three              18               0  
LC1              Cat One                 0               9  
LC2              Cat Two                 0              15  
LC4              Cat Four                0              21  

これをグループ化して合計する必要があること:

Category         Description       CurrentHours      CTDHours  
LC1              Cat One                 5              14  
LC2              Cat Two                 6              21  
LC3              Cat Three              18               0  
LC4              Cat Four                0              21  

つまり、2つの時間列をカテゴリ列と説明列でグループ化する必要があります。

新しいテーブルを作成して既存のデータをループ処理し、データを新しいテーブルに合計できることはわかっていますが、Linqを使用して簡単に実行できる方法があると思いました。私はそれを数時間グーグルで検索しましたが、私が見つけたすべての例は私がやろうとしていることに適合していないようです。

ちなみに、データテーブルを作成するodbcドライバーには、サブクエリなどの機能がないか、SQLを使用してそれを実行しただけです。

13
John

匿名オブジェクトを使用して、カテゴリと説明でグループ化します。次に、グループ化された時間を返すLinq to DataSetクエリを示します。

from r in table.AsEnumerable()
group r by new { 
     Category = r.Field<string>("Category"),
     Description = r.Field<string>("Description")
} into g
select new {
   Category = g.Key.Category,
   Description = g.Key.Description,
   CurrentHours = g.Sum(x => x.Field<int>("CurrentHours"),
   CTDHours = g.Sum(x => x.Field<int>("CurrentHours") + x.Field<int>("CTDHours"))
} 

データベースを照会している場合(質問から明確ではない):

from r in context.Table
group r by new { 
     r.Category,
     r.Description
} into g
select new {
   g.Key.Category,
   g.Key.Description,
   CurrentHours = g.Sum(x => x.CurrentHours),
   CTDHours = g.Sum(x => x.CTDHours + x.CurrentHours)
}
32

CurrentHoursCTDhoursを合計する必要があるので、

select new {
   ...
   CTDHours = g.Sum(x => x.Field<int>("CTDHours") + g.Sum(x => x.Field<int>("CurrentHours")
}
0
Sam Leach