数値のシーケンスの合計の計算
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)