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