如何:计算数值序列中的值之和 (LINQ to SQL)

使用 Sum 运算符可以计算序列中数值的和。

请注意 LINQ to SQL 中 Sum 运算符的以下特征:

  • 使用标准查询运算符中的聚合运算符 Sum 计算空序列或只包含 null 的序列时,所得结果为零。 在 LINQ to SQL 中,SQL 的语义保持不变。 因此,使用 Sum 计算空序列或只包含 null 的序列时,所得结果为 null 而非零。

  • 针对中间结果的 SQL 限制适用于 LINQ to SQL 中的聚合。 32 位整型量之和不是使用 64 位结果计算的,且在 LINQ to SQL 转换 Sum 时可能会发生溢出。 即使对于内存中的对应序列,标准查询运算符的实现不会造成溢出,仍存在这种可能性。

示例

下面的示例查找 Order 表中所有订单的总运费。

如果您对 Northwind 示例数据库运行此查询,则输出为:64942.6900。

Dim totalFreight = Aggregate ord In db.Orders _
                   Into Sum(ord.Freight)

Console.WriteLine(totalFreight)
System.Nullable<Decimal> totalFreight =
    (from ord in db.Orders
    select ord.Freight)
    .Sum();

Console.WriteLine(totalFreight);

下面的示例查找所有产品总的订购件数。

如果您对 Northwind 示例数据库运行此查询,则输出为:780。

请注意,您必须对 short 类型(例如,UnitsOnOrder)进行强制转换,因为 Sum 没有 short 类型的重载。

Dim totalUnitsOnOrder = Aggregate prod In db.Products _
                        Into Sum(prod.UnitsOnOrder)

Console.WriteLine(totalUnitsOnOrder)
System.Nullable<long> totalUnitsOnOrder =
    (from prod in db.Products
    select (long)prod.UnitsOnOrder)
    .Sum();

Console.WriteLine(totalUnitsOnOrder);

请参见

概念

下载示例数据库 (LINQ to SQL)

其他资源

聚合查询 (LINQ to SQL)