2016-10-27 1 views
0

Ich mache eine Abfrage für 2 verschiedene Ganzzahlen und mindestens eine müssen sie über 0. Das funktioniert gut, wenn ich die Select-Anweisung mache, die ich berechne Lager bezogen auf die mit dem .Sum() Methode, die mir eine null-Ausnahme an, wenn entweder int ist null, die die 0.Wählen Linq-Anweisung muss 0 zurückgeben, wenn eines der Elemente null ist

ich weiß über DefaultIfEmpty(0) aber alle anderen Fragen haben es anders dann zurückgeben muss, wie ich es tue, und Ich berechne 2 verschiedene Variablen in der Select-Anweisung und ich bin nicht erfahren genug, um diese Abfrage zu bearbeiten.

public IEnumerable<Item> GetInStockTooling() 
{ 
    try 
    { 
     using (var context = new SpectrumContext()) 
     { 
      var inStock = context.Item 
       .Include(i => i.ItemType) 
       .Include(i => i.ItemLots) 
       .Include(i => i.LocationStocks) 
       .Where(w => w.ItemLots.Any(a => a.Quantity > 0 && a.JobItemID == null) || w.LocationStocks.Any(a => a.AmountOfStock > 0) && w.ItemTypeID == (int)ItemTypes.Tooling && w.IsActive) 
       .Select(b => new 
       { 
        b, 
        ItemLots = b.ItemLots.Where(w => w.JobItemID == null && w.Quantity > 0), 
        ItemType = b.ItemType, 
        LocationStocks = b.LocationStocks.Where(w => w.AmountOfStock > 0) 
       }) 
       .AsEnumerable() 
       .Select(x => x.b) 
       .ToList() 
       .Select(x => { x.Stock = x.ItemLots.Sum(s => s.Quantity) + x.LocationStocks.Sum(s => s.AmountOfStock); return x; }); 

      return inStock; 
     } 
    } 
    catch (Exception) 
    { 
     throw; 
    } 
} 

Ich habe versucht, ?? 0 und ?? 0m auf der Quantität/AmountOfStock zu tun, aber ich erhalte ein Operand cannot be applied to type 'decimal' and 'decimal' Fehler.

Ich habe auch versucht DefaultIfEmpty verwenden, aber ich habe keine Ahnung, wo es zu benutzen, wenn man bedenkt sie innerhalb der Select all Rechen tun, und ich weiß nicht, wie ich es aus den Select für den Einsatz von DefaultIfEmpty ziehen würde.

+0

Da wir nicht sagen können, welche "andere Fragen" Sie angesehen und nicht verstanden haben, wird dies ziemlich die Schrotflinte Erfahrung sein. Haben Sie versucht, eine der Antworten in [Linq Abfrage mit Nullable Summe] (http://stackoverflow.com/q/696431/215552)? –

+0

Warum haben Sie ein 'Select', das eine anonyme Klasse erstellt, die Sie gerade mit dem' Select (x => x.b) 'durchgehen? – juharr

+0

@MikeMcCaughan Tut mir leid, ich werde schreiben, was ich versucht habe. Juharr, ich weiß es nicht. Das war hier vor meiner Zeit. Ich bin noch ein Anfänger, also verstehe ich diese Art von, aber die Syntax ist für mich verwirrend. – user4648142

Antwort

0

Versuchen Sie, nach null zu suchen, geben Sie dann 0 zurück, sonst geben Sie die Nummer zurück. Mit ternären Operator hier gehen Sie:

x.ItemLots.Sum(s => { return s.Quantity == null ? 0 : s.Quantity; }) + x.LocationStocks.Sum(s => { s.AmountOfStock == null ? 0 : s.AmountOfStock; }); 
0

Wie wäre es mit so etwas?

x.ItemLots.Sum(s => s.Quantity ?? 0) + x.LocationStocks.Sum(s => s.AmountOfStock ?? 0); 

Edit ...

Sorry, habe ich nicht den ganzen Weg bis zum Ende der Frage gelesen. Eine Sache, die bei der Fehlersuche behilflich sein kann, besteht darin, die letzte Zeile der großen linq-Anweisung (die nach ToList() endet) zu kommentieren und dort einen Haltepunkt zu setzen, um zu sehen, was das Ergebnis ist. Das kann helfen zu klären, was angeschaut wird, damit Sie wissen, wie Sie es beheben können.

+0

Oder 'x.ItemLots.Sum (s => s.Quantity) ?? 0 + x.LocationStocks.Sum (s => amAmountOfStock) ?? 0' – juharr

+0

Ich habe das ausprobiert. Ich habe einen Fehler "Operator '??" kann nicht auf 'dezimal' und 'int' eingegeben werden.Wenn ich es zu 0m ändern, bekomme ich den gleichen Fehler, aber anstelle von Int ist es dezimal – user4648142

+0

@ user4648142 Vielleicht nur eine von 'Menge' oder' AmountOfStock' ist Nullable und du würdest benutze es nur auf diesem. – juharr

Verwandte Themen