在LINQ中使用SUM和Group By

时间:2018-04-11 08:28:01

标签: c# linq

我有一个SQL查询,它产生我想要的输出。但我很难适应LINQ查询。

我的普通SQL查询如下所示:

SELECT ORDNO,CURR,SUM(AMOUNT) as SUMMEDAMT
FROM YTDTRNS
GROUP BY ORDNO,CURR

我为LINQ查询编写了一个这样的类:

public class SpecialClass
{ 
    public string ORDNO { get; set; }
    public string CURR { get; set; }
    public double SUMMEDAMT { get; set; }
}

对于我的LINQ查询,到目前为止我能够做到这一点:

var result = db.YTDTRNS.GroupBy(y => new
        {
            y.ORDNO,
            y.CURR

        }
        ).Select(z => new SpecialClass
        {
            ORDNO = z.Key.ORDNO,
            CURR = z.Key.CURR

        }
        );

我尝试使用SUM函数编写LINQ查询,如下所示:

 var result = db.YTDTRNS.GroupBy(y => new
        {
            y.ORDNO,
            y.CURR

        }
        ).Select(z => new SpecialClass
        {
            ORDNO = z.Key.ORDNO,
            CURR = z.Key.CURR,
            SUMMEDAMT = z.Sum(a => a.AMOUNT)

        }
        );

以上似乎不正确。当我为之前编写的函数发出AJAX请求时,我得到了正确的结果集。

一旦我在该函数中包含“SUM”,当我向该函数发出AJAX请求时,我收到了内部服务器错误。

这是显示ajax error()函数的错误消息:

“ExceptionMessage”:“转换为值类型'System.Double'失败,因为具体化值为null。结果类型的泛型参数或查询必须使用可空类型。”, “ExceptionType”: “System.InvalidOperationException”

2 个答案:

答案 0 :(得分:1)

行,

阅读更新后,我想您可能正在使用LINQ to Entities,它不支持Sum(expression)

你可以试试这个:

SUMMEDAMT = z.Select(a => a.AMOUNT).Sum()

但是我仍然建议你将代码包装在try / catch中并返回异常,这样它将返回更清晰的消息,而不是内部服务器错误

修改 你的类应该和你的db一样,所以你应该这样声明:

public double? SUMMEDAMT { get; set; }

答案 1 :(得分:-1)

您可以参考下面的代码,在linq查询中使用sum。





示例:





让我们玩家。每个玩家都属于一个团队,并有一个分数。球队总得分是球队中所有球员得分的总和。




  var players = new List< Player> {
新玩家{Name =“Alex”,Team =“A”,得分= 10},
新玩家{Name =“Anna”,Team =“A”,得分= 20},
新玩家{Name =“Luke”,Team =“L”,得分= 60},
新玩家{Name =“Lucy”,Team =“L”,得分= 40},
};

 var teamTotalScores =
来自玩家和#xA;由球员组成队员。团队成员为球员组
选择新的
 {
 Team = playerGroup.Key,
 TotalScore = playerGroup.Sum(x => x.Score),
 };