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")
}
Другие вопросы по тегам