2

Ich migrieren eine Website ASP.NET MVC zu ASP.NET MVC-Kern mit EF zu EF Core.EF Rückgabe null für einige, aber EF Core return 0

Ich mache eine Anfrage mit leeren Wert:

var q = bd.Prod 
      .Where(o => o.xxx == yyy) 
      .GroupBy(o => o.sss) 
      .Select(g => new 
      { 
       ccc = g.Key, 
       vvv = g.Sum(i => i.qqq), 
       bbb = g.Sum(i => i.fff), 
       nnn = g.Sum(i => i.ggg), 
      }); 

Wenn ich diesen Code mit EF return null ausgeführt werden, wenn alle Zellen der Summe sind leer. Aber EF Core gibt 0 zurück, wenn alle Zellen der Summe leer sind. Wie macht EF Core Null zurück?

+1

sie Schuld :) https://data.uservoice.com/forums/72025-entity-framework-feature-suggestions/suggestions/2410716-result-of-sum -of-a-empty-set-sollte-0-eher – grek40

+0

Derzeit kein Glück, weil EF Core 'GroupBy' im Speicher (sogenannte Client-Auswertung) verarbeitet, und dies ist bekannt Verhalten von LINQ To Objects' Sum' Implementierung . Warten Sie, bis EF Core v.2 das * eventuell * behoben hat. –

+0

@ grek40 Fast: Es ist nicht die Summe einer leeren Menge hier, es ist die Summe von 'null's. Die 'Nullen' werden verworfen, und was bleibt, ist eine leere Menge, aber das ist nicht das einzig mögliche vernünftige Verhalten, wenn man mit 'Null' konfrontiert wird. – hvd

Antwort

1

Verwendung DefaultIfEmpty:

var q = bd.Prod 
      .Where(o => o.xxx == yyy) 
      .GroupBy(o => o.sss) 
      .Select(g => new 
      { 
      ccc = g.Key, 
      vvv = g.Sum(i => i.qqq), 
      bbb = g.Sum(i => i.fff), 
      nnn = g.Sum(i => i.ggg), 
     }) 
      .DefaultIfEmpty(null); 
+1

Das OP erwähnt ausdrücklich Werte von 0 als das aktuelle unerwünschte Ergebnis. 'DefaultIfEmpty' wirkt sich darauf aus, ob überhaupt Elemente zurückgegeben werden. Mit anderen Worten, dies hat keine Auswirkung auf das OP. Es gab bereits einen Kommentar, der darauf hinwies. Es ist immer noch wahr, und es muss noch darauf hingewiesen werden. – hvd

0

Wenn Sie die folgenden Schritte aus:

  • Leere Sammlung ->null
  • Nur null Werte ->null
  • eine beliebige Kombination von Zahlen und null Werte -> Nummer

Versuchen Sie diesen Code:

items.Aggregate((int?)null, (acc, item) => acc.HasValue ? acc + item.GetValueOrDefault() : item);