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")
}