У меня есть несколько документов, которые имеют в основном идентичные поля. Различаются только два поля: Price и Quantity. Я хочу создать IEnumerable(), который содержит первый элемент, соответствующий каждой группе, но с заменой полей цены и количества на sum(), взятый из всех других соответствующих элементов в этой группе.

Т.е.

fieldone   fieldtwo   fieldthree   price   quantity
a1         b1         c1           3       5
a1         b1         c1           13      15
a1         b1         c1           23      25
a2         b2         c2           4       7
a2         b2         c2           14      17

Должен вернуться:

fieldone   fieldtwo   fieldthree   price   quantity
a1         b1         c1           39      45
a2         b2         c2           18      24

Я смотрю на GroupBy() например:

var groupedResults = results.GroupBy(a => new { 
    a.Item1.FieldOne, 
    a.Item1.FieldTwo, 
    a.Item2.FieldThree}
)

Но я не знаю, как я могу использовать это, чтобы получить желаемый результат.

0
NZJames 30 Окт 2017 в 17:42

3 ответа

Лучший ответ

Вы можете проверить это:

var result = Db.Entity
       .GroupBy(p=>new {x.fieldone, x.fiedltwo, x.fieldthree})
       .Select(p=> new { 
             fieldone = p.fieldone, 
             fieldtwo = p.fiedltwo, 
             fieldthree = p.fieldthree, 
             price = p.Sum(x=>x.price), 
             quantity = p.Sum(x=>x.quantity)}).ToList();
0
GGO 30 Окт 2017 в 14:50

Вы должны спроектировать свою группу, чтобы суммировать необходимые поля

var groupedResults = results.GroupBy(a => new { 
    a.Item1.FieldOne, 
    a.Item1.FieldTwo, 
    a.Item2.FieldThree}
).Select(g => new {
    g.Key.FieldOne,
    g.Key.FieldTwo,
    g.Key.FieldThree,
    Price = g.Sum(x => x.Price),
    Quantity = g.Sum(x => x.Quantity)
});

Существует еще одна перегрузка, в которой вы можете предоставить второй параметр GroupBy для результата, что позволяет сэкономить, если поместить Select в цепочку после GroupBy, но лично я предпочитаю этот метод выше.

2
Jamiec 30 Окт 2017 в 14:48

Вам необходимо использовать перегрузку, которая включает селектор результатов.

var groupedResults = results.GroupBy(a => new 
{ 
    a.Item1.FieldOne, 
    a.Item1.FieldTwo, 
    a.Item2.FieldThree
}, 
(key, items) => new 
{ 
    key.FieldOne,
    key.FieldTwo,
    key.FieldThree,
    Price = items.Sum(a => a.Price), 
    Quantity = items.Sum(a => a.Quantity) 
});
2
juharr 30 Окт 2017 в 14:49