Condividi tramite


Calcolare la somma dei valori in una sequenza numerica

Usare l'operatore Sum per calcolare la somma dei valori numerici in una sequenza.

Si notino le caratteristiche seguenti dell'operatore Sum in LINQ to SQL:

  • L'operatore di query standard di aggregazione Sum restituisce zero per una sequenza vuota o una sequenza che contiene 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 si applicano alle aggregazioni in LINQ to SQL. La somma delle quantità integer a 32 bit non viene calcolata usando i risultati a 64 bit e l'overflow può verificarsi per la conversione LINQ to SQL di Sum. Questa possibilità esiste anche se l'implementazione dell'operatore di query standard non causa un overflow per la sequenza in memoria corrispondente.

Esempio 1

Nell'esempio seguente viene trovato il totale del trasporto di tutti gli ordini nella tabella Order.

Se si esegue questa query sul database di esempio Northwind, l'output è: 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 trovato il numero totale di unità in ordine per tutti i prodotti.

Se si esegue questa query sul database di esempio Northwind, l'output è: 780.

Si noti che è necessario eseguire il cast di tipi come short (ad esempio, UnitsOnOrder) perché Sum non dispone di overload per i tipi 'short'.

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)

Vedere anche