Как написать запрос 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()
Другие вопросы по тегам