vacío vacios vacio vacia teoria pertenece nulos nulo notación interseccion ejercicios ejemplos conjuntos conjunto linq math linq-to-sql sum set

linq - vacios - teoria de conjuntos



¿Por qué la suma de un conjunto vacío es nula? (3)

Si lo hago:

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

Si no se devuelven registros en esta consulta arroja:

System.InvalidOperationException: el valor nulo no se puede asignar a un miembro con el tipo System.Int32, que es un tipo de valor que no admite nulos.

La única forma de que devuelva 0 es haciendo:

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

En la base de datos c.Plays es una int no nulo.

En la teoría de conjuntos, la suma de un conjunto vacío debe ser igual a 0 ( ref ). ¿Cómo es que en Linq-to-SQL decidieron devolverlo null ?


Según una fuente en Microsoft , Sum () en un conjunto vacío es null debido a la forma en que funciona en SQL:

cuando la mesa está vacía recibo esta excepción: InvalidOperationException

En SQL, el operador agregado Sum () devuelve nulo para un conjunto vacío. Así que esto es como está diseñado.


Puede usar el método Aggregate más general con una semilla de cero:

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

Esto no requiere el uso de tipos anulables.


Otra alternativa es agregar un 0 al conjunto para asegurarse de que siempre haya al menos un valor.

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