C# 按id划分的Linq组

C# 按id划分的Linq组,c#,linq,linq-group,C#,Linq,Linq Group,我需要用一列SUM(Summ)按idAuto对汽车进行分组,但它不能正常工作。你能帮忙吗 假设g.Summ是要求和的数值,而不是实际要分组的数值,那么它不应该是键的一部分 我无法测试这一点,但类似的答案可能是: var query = from c in context.Auto join r in context.Label on c.idAutoChar equals r.idAutoChar join g in context.Rent on

我需要用一列SUM(Summ)按idAuto对汽车进行分组,但它不能正常工作。你能帮忙吗

假设g.Summ是要求和的数值,而不是实际要分组的数值,那么它不应该是键的一部分

我无法测试这一点,但类似的答案可能是:

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()
            };
注意,我们不将c.Summ包括在分组by中,并且该和大于b.Summ。我还认为在这个linq声明中实际上并不需要g(Rent?)

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()
                     };
使用
Sum=v.Sum(item=>item.Key.Sum)
并且不要按
Sum
分组,否则它将为每个不同的
Sum
值生成一个分组项


顺便说一句,你为什么需要你的
where
条件-它在你的联接的
条件上复制

Sum
接受键选择器,因此它比
(从v中的b选择b.Summ)
部分更易于使用。谢谢。你帮了我。但是它应该是这样的:Sum=(从v中的b选择b.g.Sum)。Sum()是的,对不起,那是atypo@BartoszKP是的,我通过Sum=(从v中的b选择b.g.Sum)解决了这个问题。Sum()应该有
v.Sum
扩展方法可用。顺便说一句,你为什么需要你的
where
条件-它在你的联接的
条件上复制
。@user3568230不是那样写的,说真的。看看更新的版本。更干净,更准确,更短,更快。然后去掉
的where
条件,它只会减慢速度。
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)
                         };