Condividi tramite


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 motivo Sum 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)

Vedi anche