Calcular a soma dos valores em uma sequência numérica
Use o Sum operador para calcular a soma dos valores numéricos em uma sequência.
Observe as seguintes características do Sum
operador no LINQ to SQL:
O operador
Sum
de agregação Operador de Consulta Padrão é avaliado como zero para uma sequência vazia ou uma sequência que contém apenas nulos. 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 apenas nulos.As limitações do SQL em resultados intermediários aplicam-se a agregações em LINQ to SQL. A soma de quantidades inteiras de 32 bits não é calculada usando resultados de 64 bits e pode ocorrer estouro para a tradução LINQ to SQL de
Sum
. Essa possibilidade existe mesmo se a implementação do Operador de Consulta Padrão não causar 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 Order
tabela.
Se você executar essa consulta no banco de dados de exemplo 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 encomendadas para todos os produtos.
Se você executar essa consulta no banco de dados de exemplo Northwind, a saída será: 780
.
Observe que você deve transmitir short
tipos (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)