Pregunta ¿Cómo hago una consulta lambda anulable?


Estoy teniendo el siguiente error:

La conversión a valor de tipo 'System.Int32' falló porque se materializó   el valor es nulo. El parámetro genérico del tipo de resultado o la consulta   debe utilizar un tipo anulable.

¿Cómo hago que mi expresión lambda sea anulable?

d.QtyOnOrder = db.DieOrders.Where(c=>c.DrawDie.SizeUS==d.SizeUS).Sum(c => c.QtyOpen);

Actualización: el siguiente código funciona. ¿Puede alguien decirme por qué funciona la expresión Linq y no la Lambda?

            var dies = from e in db.DieOrders
                          where e.DrawDieID == d.ID && e.QtyOpen !=null
                          select e;


            var _qtyOpen = dies.Sum(x => x.QtyOpen);

5
2018-04-24 17:28


origen


Respuestas:


Me gusta la sugerencia de @ RezaRahmati, pero una alternativa es:

d.QtyOnOrder = db.DieOrders.Where(c=>c.DrawDie.SizeUS==d.SizeUS && d.QtyOpen.HasValue)
    .Sum(c => c.QtyOpen);

Si todos los QtyOpen son nulos, entonces está sumando una lista vacía que le dará cero.

Lo que me gusta de la respuesta de Reza, sin embargo, es que hace más explícito que establecerá el resultado en cero si la suma es nula.


4
2018-04-24 17:34



Creo que el problema es QtyOnOrder, ya que Sum puede devuelve nulo QtyOnOrder debe ser anulable o usar esta sintaxis:

d.QtyOnOrder = db.DieOrders.Where(c=>c.DrawDie.SizeUS==d.SizeUS).Sum(c => c.QtyOpen) ?? 0;

2
2018-04-24 17:30



Necesitaba lanzar también, por ejemplo lo siguiente;

d.QtyOnOrder = db.DieOrders.Where(c=>c.DrawDie.SizeUS==d.SizeUS)
.Sum(c => (int?)c.QtyOpen) ?? 0;

1
2017-09-03 06:00



El error indica que d.QtyOnOrder no es anulable, por lo que la solución es cambiar la definición de clase para que sea una int? (mano corta para Nullable<int>) o para usar el operador nulo coalescente en el lado izquierdo para garantizar que nunca se devuelva nulo;

db.DieOrders.Where(c=>c.DrawDie.SizeUS==d.SizeUS).Sum(c => c.QtyOpen) ?? 0;

0
2018-04-24 17:33



Si el tipo de datos de "QtyOnOrder" es En t, Deberias hacerlo como ¿En t?. Así que ahora, incluso si la suma devuelve nulo, el código no genera ningún error.

¿En t? es un tipo de datos anulable. Para saber sobre los tipos de Nullable visita. Tipos anulables.


0
2018-04-24 17:43