Почему сумма пустого множества null?

Если я это сделаю:

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.

В теории множеств сумма пустого множества должна быть равна 0 (ref). Как это происходит в Linq-to-SQL, они решили вернуть его null?

Ответ 1

Согласно источнику в Microsoft, Sum() в пустом наборе null из-за того, как он работает в SQL:

когда таблица пуста, я получаю это исключение: InvalidOperationException

В SQL оператор агрегата Sum() возвращает null для пустого набора. Таким образом, это так же хорошо спроектировано.

Ответ 2

Другой альтернативой является добавление 0 в набор, чтобы всегда было по крайней мере одно значение.

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

Ответ 3

Вы можете использовать более общий метод Aggregate с семенем нуля:

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

Это не требует использования типов с нулевым значением.