Calcolare la somma dei valori in una sequenza numerica
Per calcolare la somma di valori numerici in una sequenza, usare l'operatore Sum.
Di seguito sono riportate le caratteristiche dell'operatore Sum
in LINQ to SQL:
L'operatore di aggregazione
Sum
dell'operatore di query standard restituisce valori zero per tutte le sequenze vuote o che contengono solo valori null. In LINQ to SQL la semantica di SQL rimane invariata. Per questo motivoSum
restituisce null anziché zero per una sequenza vuota o per una sequenza che contiene solo valori null.Le limitazioni di SQL sui risultati intermedi vengono applicate agli aggregati in LINQ to SQL. La somma delle quantità di valori integer a 32 bit non viene calcolata usando risultati a 64 bit ed è possibile che si verifichi un overflow per la conversione LINQ to SQL di
Sum
. Questa possibilità esiste anche se l'implementazione dell'operatore di query standard non provoca un overflow per la corrispondente sequenza in memoria.
Esempio 1
Nell'esempio seguente viene cercato il costo di trasporto complessivo di tutti gli ordini contenuti nella tabella Order
.
Se si esegue questa query sul database di esempio Northwind, l'output sarà: 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)
Esempio 2
Nell'esempio seguente viene cercato il numero complessivo di unità ordinate per tutti i prodotti.
Se si esegue questa query sul database di esempio Northwind, l'output sarà: 780
.
Notare che è necessario eseguire il cast dei tipi short
, ad esempio UnitsOnOrder
, in quanto in Sum
non è disponibile alcun overload per tali tipi.
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)