为什么空集的和为空?
如果我这样做:
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
是一个不可为 null 的 int。
在集合论中,空集合的总和应等于 0
(ref )。 Linq-to-SQL 是如何决定让它返回 null
的?
If I do:
int updateGamePlays = db.tblArcadeGames.Where(c => c.ParentGameID == GameID).Sum(c => c.Plays);
If no records are returned in this query it throws:
System.InvalidOperationException: The null value cannot be assigned to
a member with type System.Int32 which is a non-nullable value type.
The only way to get it to return 0 is by doing:
int updateGamePlays = db.tblArcadeGames.Where(c => c.ParentGameID == GameID).Sum(c => (int?)c.Plays) ?? 0;
In the database c.Plays
is a non-nullable int.
In set theory the sum of an empty set should equal 0
(ref). How comes in Linq-to-SQL did they decide to make it return null
?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
根据 Microsoft 的消息来源,空集上的 Sum() 为
null
,因为它在 SQL 中的工作方式:According to a source at Microsoft, Sum() on an empty set is
null
because of the way it works in SQL:另一种替代方法是向集合中添加 0,以确保始终至少有一个值。
Another alternative is to add a 0 to the set to make sure there's always at least one value.
您可以使用种子为零的更通用的 Aggregate 方法:
这不需要使用可为 null 的类型。
You can use the more general
Aggregate
method with a seed of zero:This does not require using nullable types.