Calcular a soma dos valores em uma sequência numérica

Use o operador Sum para calcular a soma de valores numéricos em uma sequência.

Observe as seguintes características do operador Sum no LINQ to SQL:

  • O operador de agregação do operador de consulta padrão Sum avalia uma sequência vazia ou uma sequência que contém somente nulos como zero. No LINQ to SQL, a semântica do SQL é deixada inalterada. Por esse motivo, Sum avalia como nulo em vez de zero para uma sequência vazia ou para uma sequência que contém somente nulos.

  • As limitações do SQL em resultados intermediários se aplicam às agregações no LINQ to SQL. A soma de quantidades de inteiros de 32 bits não é computada usando resultados de 64 bits, e o estouro pode ocorrer para a tradução do LINQ to SQL de Sum. Essa possibilidade existe mesmo se a implementação do operador de consulta padrão não causa um estouro para a sequência correspondente na memória.

Exemplo 1

O exemplo a seguir localiza o frete total de todos os pedidos na tabela Order.

Se você executar essa consulta no banco de dados de exemplo do Northwind, a saída será: 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)

Exemplo 2

O exemplo a seguir localiza o número total de unidades no pedido para todos os produtos.

Se você executar essa consulta no banco de dados de exemplo do Northwind, a saída será: 780.

Observe que você deve converter tipos short (por exemplo, UnitsOnOrder) porque Sum não tem sobrecarga para tipos curtos.

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)

Confira também