c# - sirve - La conversión a valor de tipo ''Double'' falló porque el valor materializado es nulo
tipo de dato double c# (7)
CÓDIGO:
double cafeSales = db.InvoiceLines
.Where(x =>
x.UserId == user.UserId &&
x.DateCharged >= dateStart &&
x.DateCharged <= dateEnd)
.Sum(x => x.Quantity * x.Price);
ERROR:
La conversión a valor de tipo "Double" falló porque el valor materializado es nulo. El parámetro genérico del tipo de resultado o la consulta deben usar un tipo que pueda contener nulos.
LO QUE HE VISTO YA
La conversión a valor de tipo ''Int32'' falló porque el valor materializado es nulo
La conversión a valor de tipo ''Decimal'' falló porque el valor materializado es nulo
Lo que he intentado:
double cafeSales = db.InvoiceLines
.Where(x =>
x.UserId == user.UserId &&
x.DateCharged >= dateStart &&
x.DateCharged <= dateEnd)
.DefaultIfEmpty()
.Sum(x => x.Quantity * x.Price);
Y:
double? cafeSales = db.InvoiceLines
.Where(x =>
x.UserId == user.UserId &&
x.DateCharged >= dateStart &&
x.DateCharged <= dateEnd)
.Sum(x => x.Quantity * x.Price);
Ninguno de estos trabajos. Sé que la causa del problema es que no hay filas en esa tabla para el UserId que estoy transmitiendo. En ese caso, preferiría que Sum () me devolviera un 0. ¿Algunas ideas?
Esto debería hacer el truco (es posible que tenga que eliminar una de las condiciones si la Quantity
o el Price
no son anulables):
var cafeSales = db.InvoiceLines
.Where(x =>
x.UserId == user.UserId &&
x.DateCharged >= dateStart &&
x.DateCharged <= dateEnd &&
x.Quantity != null &&
x.Price != null);
double cafeSalesTotal = 0;
if (cafeSales.Any())
{
cafeSalesTotal = cafeSales.Sum(x => x.Quantity * x.Price);
}
Las soluciones anteriores no funcionaron para mí. Mi problema fue similar. Estaba seguro de que no se estaban devolviendo filas, pero Sum se comporta de alguna manera extraña. Así que decidí agregar un cheque justo antes de llamar a la expresión lambda donde compruebo la propiedad de conteo de las filas devueltas por la lambda. Si es mayor que cero, entonces llamo a la expresión de suma. Eso funcionó para mí.
Mejor solución
double cafeSales = db.InvoiceLines
.Where(x =>
x.UserId == user.UserId &&
x.DateCharged >= dateStart &&
x.DateCharged <= dateEnd)
.Sum(x => (double?)(x.Quantity * x.Price)) ?? 0;
Puede comprobar si la colección tiene algún resultado correcto.
double? cafeSales = null;
var invoices = db.InvoiceLines
.Where(x =>
x.UserId == user.UserId &&
x.DateCharged >= dateStart &&
x.DateCharged <= dateEnd
)
.Where(x => x.Quantity != null && x.Price != null);
if (invoices.Any()) {
cafeSales = invoices.Sum(x => x.Quantity * x.Price);
}
Sé que esto es un poco viejo pero por si acaso ayuda a alguien.
@Matt Supongo que el método DefaultIFEmpty()
debería funcionar para usted en caso de que pase un valor predeterminado para la columna en la que está aplicando la Sum
. Este método tiene algunas sobrecargas que es posible que desee comprobar y sugiero la conversión de tipos si las sobrecargas no son compatibles con sus requisitos.
(query).DefaultIfEmpty(0)
var cafeSales = db.InvoiceLines
.Where(x =>
x.UserId == user.UserId &&
x.DateCharged >= dateStart &&
x.DateCharged <= dateEnd)
.Sum(x => x.Quantity * x.Price);
double i;
if(cafeSales==null) ? i=0 : i=(double)cafeSales.First();
join sim in ctx.EF.Collaterals on new { id = ini.cam.id, Type = 0 } equals new
{ id = sim.CampaignId == null ? new Guid() : sim.CampaignId, sim.Type }
into tempcoll
from sim in tempcoll.DefaultIfEmpty()
Esta solución funciona. En realidad, debe usar un operador ternario para verificar el valor e insertar Guid si es nulo en la segunda columna y en la segunda tabla. Y funcionará. "La conversión para valorar el tipo ''Doble'' falló porque el valor materializado es nulo" se resolverá Gracias