2015-02-01 10 views
6

Wenn es keine Aufzeichnungen gibt, die die folgenden Lambda-Abfrage übereinstimmen, erhalte ich eineWie überprüfe ich meinen Lambda-Ausdruck auf null?

System.InvalidOperationException error. Additional information: The cast to value type 'System.Decimal' failed because the materialized value is null. Either the result type's generic parameter or the query must use a nullable type.

Der Code ist: runTime = db.Records.Where(c => c.MachineDesc.Contains(strMachine) && c.ProductionDate == dt && c.Shift == x).Sum(c => c.RunMinutes);

Die Variable runTime ein decimal ist. Ich habe versucht, es in eine decimal? zu ändern, aber ich bekomme immer noch den gleichen Fehler.

Was ist der richtige Ansatz, um dieses Problem zu lösen?

Antwort

23

Zuerst können Sie Dezimalwerte aus den Objekten auswählen, die die Bedingung erfüllten. Und dann verwendet .DefaultIfEmpty() Verfahren vor der .Sum() Methode:

runTime = db.Records 
       .Where(c => c.MachineDesc.Contains(strMachine) && c.ProductionDate == dt && c.Shift == x) 
       .Select(c => c.RunMinutes) 
       .DefaultIfEmpty() 
       .Sum(); 

DefaultIfEmpty() Funktion fügt ein einzelnes Element mit einem Standardwert, wenn die Sequenz leer ist. Und wie wir wissen, ist der defualt Wert für decimal Typ 0.0M. (Default Values Table)

Zusätzlich:

Sie haben uns nicht Linq to Was? verwenden Sie. Aber, wenn Sie LinqToEntity verwenden, dann müssen Sie Ihren Code ändern (DefaultIfEmpty nicht von EF unterstützt wird):

runTime = db.Records 
       .Where(c => c.MachineDesc.Contains(strMachine) && c.ProductionDate == dt && c.Shift == x) 
       .Sum(c => (decimal?)c.RunMinutes) ?? 0; 
+0

Dank Farhad. Ich bekomme jetzt einen Kompilierfehler: –

+0

@BillGreer Könnten Sie uns bitte sagen, was der Fehler ist? –

+0

@BillGreer Erzähl uns auch Linq, was benutzt du? Linq an Entity, Linq an Sql, Linq an Objects? –

Verwandte Themen