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