Запрос 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  

Другими словами, мне нужно суммировать группировку столбцов двух часов по столбцам Категория и Описание.

Я знаю, что я мог бы построить новую таблицу и зациклиться на существующих данных и суммировать данные в новой таблице, но я думал, что это будет более простой способ сделать это с помощью Linq. Я заглянул в него несколько часов, но все примеры, которые я нашел, похоже, не соответствовали тем, что я пытался сделать.

BTW, драйвер odbc, который создает таблицу данных, не имеет возможности для подзапросов и т.д., или я бы просто сделал это с помощью SQL.

Спасибо,

Джон

Ответ 1

Использовать анонимный объект для группировки по категориям и описанию. Вот запрос 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)
}

Ответ 2

Вам нужно суммировать CurrentHours и CTDhours, поэтому -

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