Почему сумма пустого множества 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);
Это не требует использования типов с нулевым значением.