Поделиться через


Вычисление суммы значений в числовой последовательности

Для вычисления суммы значений в последовательности чисел используется оператор Sum.

Обратите внимание на следующие характеристики Sum оператора в LINQ to SQL:

  • Для пустой последовательности или последовательности, содержащей только значения NULL, значением агрегатного оператора стандартного оператора запроса Sum является ноль. В LINQ to SQL семантика SQL остается неизменной. Поэтому для пустой последовательности или последовательности, содержащей только значения NULL, значениемSum является NULL.

  • Ограничения SQL на промежуточные результаты применяются к агрегатам в LINQ to SQL. Сумма 32-разрядных целых чисел не вычисляется с помощью 64-разрядных результатов, а переполнение может происходить для преобразования SumLINQ to SQL. Такая возможность существует, даже если реализация стандартного оператора запроса не вызывает переполнения для соответствующей последовательности в памяти.

Пример 1

В следующем примере вычисляется общая стоимость доставки всех заказов в таблице Order.

Если выполнить этот запрос в образце базы данных Northwind, то будут получены следующие выходные данные: 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)

Пример 2

В следующем примере вычисляется общее число заказанных элементов для всех продуктов.

Если выполнить этот запрос в образце базы данных Northwind, то будут получены следующие выходные данные: 780.

Обратите внимание на необходимость приведения типов short (например, UnitsOnOrder), поскольку Sum не имеет перегрузки для коротких типов.

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)

См. также