Почему сумма пустого множества равна нулю? - PullRequest
13 голосов
/ 29 декабря 2011

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

int updateGamePlays = db.tblArcadeGames.Where(c => c.ParentGameID == GameID).Sum(c => c.Plays);

Если в этом запросе не возвращаются записи, он выдает:

System.InvalidOperationException: Нулевое значение не может быть назначено члену сТип System.Int32, который является необнуляемым типом значения.

Единственный способ вернуть значение 0 - выполнить:

int updateGamePlays = db.tblArcadeGames.Where(c => c.ParentGameID == GameID).Sum(c => (int?)c.Plays) ?? 0;

В базе данных c.Playsявляется ненулевым int.

В теории множеств сумма пустого множества должна равняться 0 ( ref ).Почему в Linq-to-SQL они решили вернуть null?

Ответы [ 3 ]

10 голосов
/ 29 декабря 2011

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

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

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

2 голосов
/ 13 февраля 2015

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

int updateGamePlays = db.tblArcadeGames.Where(c => c.ParentGameID == GameID)
                                       .Select(c => c.Plays)
                                       .Concat(new [] { 0 })
                                       .Sum();
0 голосов
/ 17 января 2013

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

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

Это не требует использования типов, допускающих обнуление.

...