Вычисление суммы значений в числовой последовательности
Для вычисления суммы значений в последовательности чисел используется оператор Sum.
Обратите внимание на следующие характеристики Sum
оператора в LINQ to SQL:
Для пустой последовательности или последовательности, содержащей только значения NULL, значением агрегатного оператора стандартного оператора запроса
Sum
является ноль. В LINQ to SQL семантика SQL остается неизменной. Поэтому для пустой последовательности или последовательности, содержащей только значения NULL, значениемSum
является NULL.Ограничения SQL на промежуточные результаты применяются к агрегатам в LINQ to SQL. Сумма 32-разрядных целых чисел не вычисляется с помощью 64-разрядных результатов, а переполнение может происходить для преобразования
Sum
LINQ 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)