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
Linda Hamiltonoriginal
2025-01-10 20:56:45713parcourir

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>

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>
  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>

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!

Déclaration:
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