Запрос 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. Я гуглил несколько часов, но все примеры, которые я нашел, не выпирал, что я пытаюсь сделать.

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

2 ответов


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

вам нужно суммировать CurrentHours и CTDhours, так

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