Maison > développement back-end > C++ > Comment éviter les erreurs « Échec de la diffusion » lors de la somme d'entiers nullables dans LINQ ?

Comment éviter les erreurs « Échec de la diffusion » lors de la somme d'entiers nullables dans LINQ ?

Linda Hamilton
Libérer: 2025-01-10 20:56:45
original
701 Les gens l'ont consulté

How to Avoid

Gestion des valeurs nulles dans les requêtes LINQ : résolution de l'erreur "Échec de la conversion"

Lors de l'exécution d'une requête LINQ, les développeurs peuvent rencontrer l'erreur : "Impossible de convertir en type de valeur 'Int32' car la valeur matérialisée est nulle." Ce problème se produit lors de la tentative de conversion d'une valeur nullable en une valeur de type valeur non nullable. .

La requête LINQ suivante illustre cette situation :

<code>var creditsSum = (from u in context.User
                  join ch in context.CreditHistory on u.ID equals ch.UserID                                        
                  where u.ID == userID
                  select ch.Amount).Sum();</code>
Copier après la connexion

Cette requête calcule la somme de la colonne Montant pour un ID utilisateur spécifique dans la table CreditHistory. Toutefois, s'il n'existe aucun enregistrement pour l'utilisateur spécifié dans la table CreditHistory, l'expression ch.Amount renvoie la valeur null. Cette valeur nulle ne peut pas être convertie en type de valeur non nullable Int32, ce qui entraîne une erreur.

Solution : Gestion des valeurs nulles

Afin de gérer les valeurs nullables dans les requêtes LINQ, il existe deux approches possibles :

  1. Utiliser DefaultIfEmpty : Cette méthode ajoute une valeur par défaut aux résultats de la requête si aucune ligne n'est renvoyée. Dans le scénario donné, la requête peut être modifiée en :
<code>var creditsSum = (from u in context.User
                  join ch in context.CreditHistory on u.ID equals ch.UserID                                        
                  where u.ID == userID
                  select ch.Amount).DefaultIfEmpty(0).Sum();</code>
Copier après la connexion
  1. Utilisation de l'opérateur conditionnel (??) : L'opérateur conditionnel (??) permet de préciser une valeur par défaut à utiliser en cas de résultat nul. La requête peut être réécrite comme :
<code>var creditsSum = (from u in context.User
                  join ch in context.CreditHistory on u.ID equals ch.UserID                                        
                  where u.ID == userID
                  select (int?)ch.Amount).Sum() ?? 0;</code>
Copier après la connexion

Dans cette version, l'expression (int?)ch.Amount convertit explicitement la valeur en int?, indiquant qu'elle peut être nulle. L'opérateur ?? suivant remplace toutes les valeurs nulles par la valeur par défaut de 0.

En implémentant l'une ou l'autre de ces deux méthodes, la requête peut gérer avec succès les valeurs nulles et renvoyer les résultats souhaités.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal