为什么空集的总和为空?

时间:2011-12-29 03:02:50

标签: linq math linq-to-sql sum set

如果我这样做:

int updateGamePlays = db.tblArcadeGames.Where(c => c.ParentGameID == GameID).Sum(c => c.Plays);

如果此查询中未返回任何记录,则抛出:

  

System.InvalidOperationException:无法将null值分配给   System.Int32类型的成员,它是一个不可为空的值类型。

让它返回0的唯一方法是:

int updateGamePlays = db.tblArcadeGames.Where(c => c.ParentGameID == GameID).Sum(c => (int?)c.Plays) ?? 0;

在数据库中c.Plays是一个不可为空的int。

在集合论中,空集的总和应该等于0ref)。他们如何决定让Linq-to-SQL返回null

3 个答案:

答案 0 :(得分:9)

According to a source at Microsoft,空集上的Sum()是null,因为它在SQL中的工作方式:

  

当表为空时,我得到此异常:InvalidOperationException

     
    

在SQL中,Sum()聚合运算符为空集返回null。所以这就是设计的。

  

答案 1 :(得分:2)

另一种方法是在集合中添加0以确保始终至少有一个值。

int updateGamePlays = db.tblArcadeGames.Where(c => c.ParentGameID == GameID)
                                       .Select(c => c.Plays)
                                       .Concat(new [] { 0 })
                                       .Sum();

答案 2 :(得分:0)

您可以使用更通用的Aggregate方法,种子为零:

int updateGamePlays = db.tblArcadeGames
    .Where(c => c.ParentGameID == GameID)
    .Aggregate(0, (a, c) => a + c.Plays);

这不需要使用可空类型。