Básicamente, cuando hago la siguiente consulta, si no se encontraron coincidencias, la siguiente consulta arroja una excepción. En ese caso, preferiría que la suma igualara 0 en lugar de que se lanzara una excepción. ¿Sería esto posible en la consulta en sí misma, quiero decir, en lugar de almacenar la consulta y verificar query.Any()?
double earnings = db.Leads.Where(l => l.Date.Day == date.Day
&& l.Date.Month == date.Month
&& l.Date.Year == date.Year
&& l.Property.Type == ProtectedPropertyType.Password
&& l.Property.PropertyId == PropertyId).Sum(l => l.Amount);
c#
.net
entity-framework
John Mayer
fuente
fuente

Whereno volveríanullsi no encontrara ningún registro, devolvería una lista de cero elementos. ¿Cual es la excepción?SQLse genera.Amounten realidad no lo esnull, es realmente un problema en torno a cómo maneja los resultados cero. Echa un vistazo a la respuesta que se proporcionó.decimal, su código debe usardecimal. ¡Olvídate de que alguna vez conocistefloatydoubleen tu carrera de programación hasta el día en que alguien te dice que los uses, para estadísticas o luminancia estelar o los resultados de un proceso estocástico o carga de un electrón! Hasta entonces, lo estás haciendo mal .Respuestas:
Intente cambiar su consulta a esto:
De esta manera, su consulta solo seleccionará el
Amountcampo. Si la colección está vacía, devolverá un elemento con el valor de0y luego se aplicará la suma.fuente
Sumellos en el lado del servidor, en lugar del lado de la base de datos? La solución de imo 2kay es más óptima, al menos más semánticamente correcta.IQueryable<T>cadena se detiene (por lo general cuando se llamaToList,AsEnumerableetc .. y en este casoSum).Sumes un método conocido y manejado por el proveedor EF Queryable y generará la instrucción SQL relacionada.SELECT SUM(a.Amount) FROM (SELECT Amount FROM Leads WHERE ...) AS alugar de soloSELECT SUM(Amount) FROM Leads. Además, la subconsulta tiene una comprobación nula adicional y una combinación externa extraña con una sola tabla de filas.DefaultIfEmptyno es compatible con una serie de proveedores de LINQ, por lo que deberá agregarToList()algo similar antes de usarlo en esos casos para que se aplique en el escenario LINQ to Objects .Prefiero usar otro truco:
fuente
Intente esto en su lugar, es más corto:
fuente
Eso es una victoria para mí:
En mi tabla INICIAR SESIÓN, en el campo NUMBEROFLOGINS, algunos valores son NULL y otros tienen un número INT. Resumo aquí NUMBEROFLOGINS totales de todos los usuarios de una Corporación (cada Id).
fuente
Tratar:
La consulta " SELECCIONAR SUMA ([Cantidad]) " devolverá NULL para la lista vacía. Pero si usa LINQ, espera que la " Suma (l => l.Amount) " devuelva el doble y no le permita usar " ?? operador " para establecer 0 para la colección vacía.
Para evitar esta situación, debe hacer que LINQ espere " ¿doble? ". Puedes hacerlo lanzando " (¿doble?) L.Amount ".
No afecta la consulta a SQL pero hace que LINQ funcione para colecciones vacías.
fuente
fuente
ToListaquí si todo lo que quieres es la suma. Esto devolverá todo el conjunto de resultados (soloAmountpara cada registro en este caso) en la memoria y luegoSum()ese conjunto. Mucho mejor usar otra solución que haga el cálculo a través de SQL Server.