为什么空集的和为空?

发布于 2024-12-23 12:17:56 字数 664 浏览 0 评论 0原文

如果我这样做:

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

无名指的心愿 2024-12-30 12:17:56

根据 Microsoft 的消息来源,空集上的 Sum() 为 null,因为它在 SQL 中的工作方式:

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

<块引用>

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

According to a source at Microsoft, Sum() on an empty set is null because of the way it works in SQL:

when the table is empty i´m getting this exception: InvalidOperationException

In SQL, Sum() aggregate operator returns null for an empty set. So this is as designed.

虫児飞 2024-12-30 12:17:56

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

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

Another alternative is to add a 0 to the set to make sure there's always at least one value.

int updateGamePlays = db.tblArcadeGames.Where(c => c.ParentGameID == GameID)
                                       .Select(c => c.Plays)
                                       .Concat(new [] { 0 })
                                       .Sum();
花落人断肠 2024-12-30 12:17:56

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

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

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

You can use the more general Aggregate method with a seed of zero:

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

This does not require using nullable types.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文