Calcular la suma de valores de una secuencia numérica

Utilice el operador Sum para calcular la suma de los valores numéricos de una secuencia.

Tenga en cuenta las características siguientes del operador Sum en LINQ to SQL:

  • El operador de consulta estándar de agregado Sum se evalúa como cero para una secuencia vacía o una secuencia que solo contiene valores nulos. En LINQ to SQL, la semántica de SQL se mantiene invariable. Por esta razón, Sum se evalúa como Null en lugar de cero en el caso de secuencias vacías o secuencias que solo contienen valores nulos.

  • En LINQ to SQL se aplican las restricciones de SQL para los agregados en los resultados intermedios. La suma de cantidades enteras de 32 bits no se calcula utilizando resultados de 64 bits, y puede producirse un desbordamiento en la conversión que LINQ to SQL realiza de Sum. Esta posibilidad existe aun cuando la implementación del operador de consulta estándar no produzca un desbordamiento para la secuencia en memoria correspondiente.

Ejemplo 1

En el ejemplo siguiente se busca el flete total de todos los pedidos de la tabla Order.

Si ejecuta esta consulta en la base de datos de ejemplo Northwind, el resultado es: 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)

Ejemplo 2

En el ejemplo siguiente se busca el número total de unidades pedidas para todos los productos.

Si ejecuta esta consulta en la base de datos de ejemplo Northwind, el resultado es: 780.

Tenga en cuenta que debe convertir los tipos short (por ejemplo, UnitsOnOrder) porque Sum no tiene una sobrecarga para ellos.

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)

Consulte también