数値のシーケンスの合計の計算

Sum 演算子を使用すると、シーケンス内の数値の合計を計算できます。

LINQ to SQL の Sum 演算子には、次の特性があります。

  • 標準クエリ演算子の集計演算子 Sum では、空のシーケンスや null のみを含むシーケンスはゼロに評価されます。 LINQ to SQL では、SQL のセマンティクスは維持されます。 したがって、空のシーケンスまたは null のみを含むシーケンスについては、Sum 演算子は 0 ではなく null に評価します。

  • LINQ to SQL での集計には、中間結果に対する SQL の制限が適用されます。 64 ビットの結果を使って 32 ビット整数の合計値を計算することはできません。LINQ to SQL による Sum の変換で、オーバーフローが発生する可能性があります。 これは、標準クエリ演算子の実装で、対応するメモリ内シーケンスでオーバーフローが発生しない場合でも起こる可能性があります。

例 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 型のオーバーロードがないため、short 型 (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)

関連項目