如果我这样做:
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。
在集合论中,空集的总和应该等于0
(ref)。他们如何决定让Linq-to-SQL返回null
?
答案 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);
这不需要使用可空类型。