2014-04-24 13 views
5

Sto ottenendo il seguente errore:Come faccio a rendere nullable una query lambda?

The cast to value type 'System.Int32' failed because the materialized value is null. Either the result type's generic parameter or the query must use a nullable type.

Come faccio a fare il mio lambda espressione annullabile?

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

Aggiornamento: Il codice seguente funziona. Qualcuno può dirmi perché l'espressione di Linq funzioni e la Lambda no?

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


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

È 'd.QtyOnOrder' nullable? –

+0

Qual'è il tipo di dati di "QtyOnOrder"? –

+0

È un valore nullable int. –

risposta

4

mi piace @ suggerimento di RezaRahmati, ma in alternativa è:

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

Se tutte le QtyOpen sono nulli, allora si sta sommando una lista vuota che vi darà zero.

Ciò che mi piace della risposta di Reza, tuttavia, è che rende più esplicito che imposterai il risultato a zero se la somma è nulla.

2

Credo che il problema è QtyOnOrder, dal momento che Sum può restituisce null QtyOnOrder dovrebbe essere annullabile o utilizzare la seguente sintassi:

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

Ho provato questo e ottengo il seguente: Il cast sul valore tipo 'System.Int32' non è riuscito perché il valore materializzato è nullo. Il parametro generico del tipo di risultato o la query devono utilizzare un tipo nullable. –

0

L'errore indica che d.QtyOnOrder non è annullabile in modo che la soluzione è quella di cambiare il definizione della classe in modo che sia una int? (mano corta per Nullable<int>) o per utilizzare l'operatore di coalescenza nulla sul lato sinistro per garantire che null non venga mai restituito;

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

Se il tipo di dati "QtyOnOrder" è int, è necessario impostarlo come int?. Quindi ora anche se la somma restituisce null, il codice non genera alcun errore.

int? è un tipo di dati nullable. Per conoscere i tipi di Nullable Visita Nullable Types.

1

Avevo anche bisogno di trasmettere, per esempio quanto segue;

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