La conversión para valorar el tipo ‘Doble’ falló porque el valor materializado es nulo

CÓDIGO:

double cafeSales = db.InvoiceLines .Where(x => x.UserId == user.UserId && x.DateCharged >= dateStart && x.DateCharged  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  x.Quantity * x.Price); 

Y:

 double? cafeSales = db.InvoiceLines .Where(x => x.UserId == user.UserId && x.DateCharged >= dateStart && x.DateCharged  x.Quantity * x.Price); 

Ninguno de estos trabajos. Sé que la causa del problema es que no hay filas en esa tabla para el Id. De usuario que estoy pasando. En ese caso, preferiría que Sum () me devolviera un 0. ¿Algunas ideas?

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) 

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); } 
  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(); 

Las soluciones anteriores no funcionaron para mí. Mi problema era 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 sum. Eso funcionó para mí.

 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