Comment : calculer la somme de valeurs dans une séquence numérique
Utilisez l'opérateur Sum pour calculer la somme des valeurs numériques dans une séquence.
Notez les caractéristiques suivantes de l’opérateur Sum
dans LINQ to SQL :
L'opérateur d'agrégation (opérateur de requête standard)
Sum
prend la valeur zéro pour une séquence vide ou contenant uniquement des valeurs null. Dans LINQ to SQL, la sémantique de SQL reste inchangée.Sum
prend donc la valeur null plutôt que la valeur zéro pour une séquence vide ou contenant uniquement des valeurs null.Les limitations de SQL sur les résultats intermédiaires s’appliquent aux agrégats dans LINQ to SQL. La somme de quantités d’entiers 32 bits n’est pas calculée en utilisant des résultats 64 bits, et un dépassement de capacité peut se produire pour la traduction LINQ to SQL de
Sum
. Ce risque existe même si l'implémentation de l'opérateur de requête standard n'entraîne pas de dépassement de capacité pour la séquence en mémoire correspondante.
Exemple 1
L'exemple suivant recherche les frais de transport totaux pour toutes les commandes de la table Order
.
Si vous exécutez cette requête sur l'exemple de base de données Northwind, vous obtenez le résultat suivant : 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)
Exemple 2
L'exemple suivant recherche le nombre total d'unités commandées pour tous les produits.
Si vous exécutez cette requête sur l'exemple de base de données Northwind, vous obtenez le résultat suivant : 780
.
Notez que vous devez effectuer un cast des types short
(par exemple, UnitsOnOrder
) car Sum
n'a aucune surcharge pour les types courts.
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)