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
Where
no volveríanull
si no encontrara ningún registro, devolvería una lista de cero elementos. ¿Cual es la excepción?SQL
se genera.Amount
en 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 conocistefloat
ydouble
en 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
Amount
campo. Si la colección está vacía, devolverá un elemento con el valor de0
y luego se aplicará la suma.fuente
Sum
ellos 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
,AsEnumerable
etc .. y en este casoSum
).Sum
es 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 a
lugar 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.DefaultIfEmpty
no 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
ToList
aquí si todo lo que quieres es la suma. Esto devolverá todo el conjunto de resultados (soloAmount
para 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.