Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq 为什么空集的和为空?_Linq_Math_Linq To Sql_Sum_Set - Fatal编程技术网

Linq 为什么空集的和为空?

Linq 为什么空集的和为空?,linq,math,linq-to-sql,sum,set,Linq,Math,Linq To Sql,Sum,Set,如果我这样做: int updateGamePlays = db.tblArcadeGames.Where(c => c.ParentGameID == GameID).Sum(c => c.Plays); 如果此查询中未返回任何记录,则抛出: System.InvalidOperationException:无法将空值分配给 类型为System.Int32的成员,它是不可为null的值类型 使其返回0的唯一方法是执行以下操作: int updateGamePlays = db.t

如果我这样做:

int updateGamePlays = db.tblArcadeGames.Where(c => c.ParentGameID == GameID).Sum(c => c.Plays);
如果此查询中未返回任何记录,则抛出:

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

使其返回0的唯一方法是执行以下操作:

int updateGamePlays = db.tblArcadeGames.Where(c => c.ParentGameID == GameID).Sum(c => (int?)c.Plays) ?? 0;
在数据库中,
c.Plays
是一个不可为空的int

在集合论中,一个空集的和应该等于
0
()。Linq to SQL是如何决定让它返回
null

,空集合上的Sum()是
null
,因为它在SQL中的工作方式:

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

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


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

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

这不需要使用可为空的类型。

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

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

这是更多的数据库,更少的集合论。SQL Server中可为null的列的
和是多少?@Marc在我链接到的问题中,没有一列是可为null的。L2S dbml是否知道对于此数据集?如果是的话,我会假设该字段是一个
int
而不是
int?
。@Marc yes dbml知道它是一个不可为空的int字段,除非我遗漏了什么,否则
int
的总和是一个
int
,而不是一个
int?
。是否知道它在编译时不可为null?我不知道LINQ to SQL,但LINQ to Entities不支持聚合。但如果对空IEnumerable使用Sum,它将正确返回0。因此,Microsoft选择使IQueryable上的Sum()与SQL一致,但与IEnumerable上的Sum()不一致。模棱两可的选择。。。