Freigeben über


Berechnen der Summe von Werten in einer numerischen Sequenz

Verwenden Sie den Sum-Operator, um die Summe numerischer Werte in einer Sequenz zu berechnen.

Beachten Sie die folgenden Merkmale des Sum-Operators in LINQ to SQL:

  • Der Sum-Operator für Standardabfragen führt bei einer leeren Sequenz oder bei einer aus Nullen bestehenden Sequenz zum Ergebnis NULL. In LINQ to SQL bleibt die SQL-Semantik unverändert. Aus diesem Grund ergibt Sum bei einer leeren Sequenz oder bei einer aus Nullen bestehenden Sequenz den Wert NULL an Stelle von 0.

  • SQL-Einschränkungen für Zwischenergebnisse gelten in LINQ to SQL für Aggregate. Die Summe von 32-Bit-Ganzzahlen wird nicht mithilfe von 64-Bit-Ergebnissen berechnet, und bei der LINQ to SQL-Übersetzung von Sum kann es zu einem Überlauf kommen. Dies kann ggf. auch eintreten, wenn die standardmäßige Implementierung des Abfrageoperators bei der entsprechenden Sequenz im Arbeitsspeicher nicht zu einem Überlauf führt.

Beispiel 1

Im folgenden Beispiel wird die gesamte Fracht zu allen Bestellungen in der Tabelle Order ermittelt.

Wenn Sie diese Abfrage mit der Beispieldatenbank Northwind ausführen, lautet die Ausgabe 64942.6900.

System.Nullable<Decimal> totalFreight =
    (from ord in db.Orders
    select ord.Freight)
    .Sum();

Console.WriteLine(totalFreight);
Dim totalFreight = Aggregate ord In db.Orders _
                   Into Sum(ord.Freight)

Console.WriteLine(totalFreight)

Beispiel 2

Im folgenden Beispiel wird die Gesamtzahl von bestellen Einheiten für alle Produkte ermittelt.

Wenn Sie diese Abfrage mit der Beispieldatenbank Northwind ausführen, lautet die Ausgabe 780.

Beachten Sie, dass Sie short-Typen (z. B. UnitsOnOrder) verwenden müssen, da Sum nicht über einen Überlauf für diese Typen verfügt.

System.Nullable<long> totalUnitsOnOrder =
    (from prod in db.Products
    select (long)prod.UnitsOnOrder)
    .Sum();

Console.WriteLine(totalUnitsOnOrder);
Dim totalUnitsOnOrder = Aggregate prod In db.Products _
                        Into Sum(prod.UnitsOnOrder)

Console.WriteLine(totalUnitsOnOrder)

Siehe auch