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()不一致。模棱两可的选择。。。