Как написать запрос LINQ, объединяющий группу по и агрегаты?
Учитывая следующие данные, как мне написать запрос или выражение LINQ для возврата агрегированного результирующего набора для количества?
Входные данные:
var foo = new[] { new { PO = "1", Line = 2, QTY = 0.5000 },
new { PO = "1", Line = 2, QTY = 0.2500 },
new { PO = "1", Line = 2, QTY = 0.1000 },
new { PO = "1", Line = 2, QTY = -0.1000 }
}.ToList();
Желаемый результат:
Нечто подобное
new { PO = "1", Line = 2, QTY = 0.7500 } // .5 + .25 + .1 + -.1
Как бы я написал это для нескольких строк (см. Объектную модель в foo)?
2 ответа
Решение
Как насчет этого:
var result = foo.GroupBy(x => x.Line)
.Select(g => new { PO = g.First().PO,
Line = g.Key,
QTY = g.Sum(x => x.QTY) });
В случае, если у вас есть только одна строка, просто добавьте .Single()
- result
является IEnumerable
анонимного типа, определенного при настройке foo
,
Редактировать:
Если и PO, и Line должны обозначать разные группы (PO могут иметь разные значения), они оба должны быть частью ключа группы:
var result = foo.GroupBy(x => new { x.PO, x.Line})
.Select(g => new {
PO = g.Key.PO,
Line = g.Key.Line,
QTY = g.Sum(x => x.QTY)
});
var query = (from t in foo
group t by new {t.PO, t.Line}
into grp
select new
{
grp.Key.PO,
grp.Key.Line,
QTY = grp.Sum(t => t.QTY)
}).ToList()