2010-05-22 2 views
1

J'ai le code suivant pour récupérer le nom du client, le total (commandes), la somme (détails de la commande) pour atteindre le client dans la base de données Northwind. Le problème avec le code ci-dessous est qu'il soulève une exception puisque quelques clients n'ont aucune entrée dans la table des commandes.Gestion des exceptions dans Linq to SQL pour les clients sans commandes

Je sais qu'en utilisant la syntaxe de requête (join) l'exception peut être évitée. Je veux savoir si la même chose peut être traitée avec la syntaxe de la méthode d'extension.

var customerOrders = db.Customers 
    .Select(c => new 
    { 
     CompanyName = c.CompanyName, 
     TotalOrders = c.Orders.Count(), 
     TotalQuantity = c.Orders 
      .SelectMany(o => o.Order_Details).Sum(o=>o.Quantity) 
    }); 

Répondre

3

Je pense que le problème est que dans SQL, la fonction SUM peut retourner null et Ling-to-SQL attend un int. Vous pouvez contourner ce problème en procédant comme suit:

TotalQuantity = 
    (int?)c.Orders.SelectMany(o => o.Order_Details).Sum(o=>o.Quantity) 

puis de vérifier les valeurs nulles. Je pense que cela va aussi travailler

TotalQuantity = 
    ((int?)c.Orders.SelectMany(o => o.Order_Details).Sum(o=>o.Quantity)) ?? 0 

si vous le souhaitez par défaut à 0.

La raison pour laquelle cela se produit est parce que le SQL LINQ to SQL génère des résultats dans une valeur nulle pour la quantité colonne quand il n'y a pas de détails. Un moyen facile de déterminer ce problème avec ce type d'erreur consiste à définir db.Log sur Console.Out et à copier le SQL généré dans SSMS pour voir les résultats. Vous verrez probablement que le SQL généré crée une jointure à gauche qui entraîne une ou plusieurs valeurs nulles dans la colonne Quantité. Soit cela, ou il y aura une sous-requête qui aboutit à la valeur nulle.

0

Je ne vois pas l'exception ici, sauf clientOrders pourrait être nul. Qu'est-ce que j'ai raté? Edit: OK, je vois que le problème est avec l'opérateur SelectMany

Le problème peut être que TotalQuantity n'est pas Nullable.

+0

Il ne devrait pas y avoir de références nulles car la requête sera traduite en une instruction SQL. Et il ne devrait pas y avoir de problème avec TotalQuantity. Au début, le type est déduit de toute façon et la seconde sur une séquence vide est juste zéro. –

0

La syntaxe de la requête est seulement eye candy et est traduite dans les méthodes d'extension lors de la compilation. De plus, les méthodes d'extension sont strictement plus puissantes car il n'y a pas de syntaxe de requête pour toutes les méthodes d'extension. Vous pouvez simplement utiliser Enumerable.Join pour effectuer une jointure avec les méthodes d'extension.

Mais je suis incapable de repérer le problème - je ne m'attendrais pas à ce que votre code provoque une exception. Quelle est l'exception réelle et où cela se produit-il?

0

Est-ce que Quantity est valide? Je soupçonne que c'est là où l'exception se produit, puisque tous les autres cas devraient être juste une énumération vide qui ne provoquera pas une exception nulle.

Les détails d'exception aideraient certainement!