0
var query = from c in context.Auto
            join r in context.Label on c.idAutoChar equals r.idAutoChar
            join g in context.Rent on c.idAuto equals g.idAuto
            where c.idAutoChar == r.idAutoChar && c.idAuto == g.idAuto
            group new {c, r, g} by new {c.idAuto, r.Name, c.RegNumber, g.Summ} into v
            select new
            {
                v.Key.idAuto,
                v.Key.Name,
                v.Key.RegNumber,
                Sum = (from b in v select v.Key.Summ).Sum()
            };

I need to group Cars by idAuto with a column of SUM(Summ) but it didn't work correctly. Could you please help.

ekad
  • 14,436
  • 26
  • 44
  • 46

2 Answers2

1
var query = from c in context.Auto
                 join r in context.Label on c.idAutoChar equals r.idAutoChar
                 join g in context.Rent on c.idAuto equals g.idAuto
                 //where c.idAutoChar == r.idAutoChar && c.idAuto == g.idAuto //???
                 group new {c, r, g} by new {c.idAuto, r.Name, c.RegNumber} into v
                         select new
                         {
                             v.Key.idAuto,
                             v.Key.Name,
                             v.Key.RegNumber,
                             Sum = v.Sum(item => item.Key.Summ)
                         };

use Sum = v.Sum(item => item.Key.Summ) and don't group by Summ, otherwise it will produce a group item for each different Summ value.

BTW, why do you need your where condition - it replicates on conditions of your joins

Andrew
  • 3,648
  • 1
  • 15
  • 29
0

Assuming that g.Summ is a numeric value you want to sum on, and not something you actually want to group on then it shouldn't be part of the key.

I've no way of testing this, but something like this might be the answer:

c in context.Auto
                     join r in context.Label on c.idAutoChar equals r.idAutoChar
                     join g in context.Rent on c.idAuto equals g.idAuto
                     where c.idAutoChar == r.idAutoChar && c.idAuto == g.idAuto
                     group new {c, r, g} by new {c.idAuto, r.Name, c.RegNumber} into v
                     select new
                     {
                         v.Key.idAuto,
                         v.Key.Name,
                         v.Key.RegNumber,
                         Sum = (from b in v
                                           select b.Summ).Sum()
                     };

Note we don't include c.Summ in the group by, and the Sum is then over b.Summ. I also think that g (Rent?) isn't actually required in this linq statement.

samjudson
  • 56,243
  • 7
  • 59
  • 69
  • `Sum` accepts key selector, so it would be a bit more readable to use instead of the `(from b in v select b.Summ)` part. – BartoszKP Apr 24 '14 at 10:12
  • Thank you. You helped me. But just it should be like this: Sum = (from b in v select b.g.Summ).Sum() – user3568230 Apr 24 '14 at 10:13