42 votes

Comment déboguer une instruction LINQ

J'ai une Linq to objects déclaration

 var confirm = from l in lines.Lines 
 where (l.LineNumber == startline.LineNumber) || (l.LineNumber == endline.LineNumber) 
 select l;

L'confirmer objet est de retourner un Objet Nul ou n'est Pas Une Référence " au Système.Linq.Énumérable.WhereListIterator`1.MoveNext()

Si le résultat de la requête est vide, il serait juste de retour d'un vide à l'énumérateur. Je sais pour un fait qu'il n'y a pas des objets null dans la déclaration. Est-il possible d'étape à travers le LINQ déclaration de voir où il est tomber?

EDIT Quand j'ai dit que je sais pour un fait qu'il n'y a pas des objets nuls , il s'avère que j'étais couché :[, mais la question demeure de savoir si je suis considère que la réponse sera "vous ne pouvez pas vraiment"

LINQPad est une bonne idée, je l'ai utilisé pour m'enseigner LINQ, mais je peut commencer de le regarder à nouveau comme un debug / brûlis, le style de l'outil

31voto

OwenP Points 11164

Je ne sais pas s'il est possible de déboguer à partir de VS, mais je trouve que LINQPad est assez utile. Il vous permettra de vider les résultats de chaque partie de la requête LINQ.

18voto

Steve Steiner Points 4044

Vous devriez être en mesure de définir un point d'arrêt sur l'expression dans l' where clause de vos LINQ déclaration.

Dans cet exemple, placez le curseur n'importe où dans la section de code suivante:

(l.LineNumber == startline.LineNumber) || (l.LineNumber == endline.LineNumber)

Puis appuyez sur F9 ou utilisez le menu ou le menu contextuel pour ajouter le point d'arrêt.

Lorsqu'il est installé correctement, seul le code ci-dessus devrait avoir le point d'arrêt de mise en forme dans l'éditeur plutôt que de l'ensemble de LINQ déclaration. Vous pouvez également regarder dans les points d'arrêt de la fenêtre pour voir.

Si vous avez configuré correctement, vous ferez un arrêt à chaque fois que la fonction qui implémente la partie ci-dessus de la requête.

15voto

Michael Sorens Points 9637

J'ai écrit un article complet traitant de cette question; il a été publié sur Simple-Talk.com (LINQ Secrets Révélés: le Chaînage et de Débogage), en décembre 2010. Vous pourriez avoir besoin de s'inscrire pour lire l'article (site semble aller par le biais de quelques changements ces derniers jours) donc, ici, sont quelques uns des faits saillants de l'article:

Je parle de LINQPad (comme mentionné plus tôt par OwenP) comme un excellent outil externe à Visual Studio. Payer une attention particulière à son extraordinaire méthode Dump (). Vous pouvez injecter ce à un ou plusieurs points dans une LINQ chaîne pour voir vos données visualisées dans un étonnamment propre et claire de la mode.

Mais il existe plusieurs techniques pour utiliser au sein de Visual Studio parce que parfois c'est juste pas pratique pour migrer un morceau de code à LINQPad:

(1) s'Injecter des appels à la Dump() extension de la méthode que je présente dans mon article afin de permettre à l'enregistrement. J'ai commencé avec Bart De Smet Watch() la méthode dans son article instructif LINQ to Objects – Débogage et ajouté un peu de l'étiquetage et de la colorisation à améliorer la visualisation, mais encore il n'est rien en comparaison de LINQPad de la sortie de Vidage.

(2) Apporter LINQPad de visualisation du droit dans Visual Studio avec Robert Ivanc de LINQPad Visualizer complément. Vous ne savez pas si c'est grâce à mon insistance :-), mais les quelques inconvénients que présente quand j'ai écrit mon article ont maintenant tous été admirablement résolu dans la dernière version. Il a plein VS2010 soutien et vous permet d'examiner tout objet que vous aimez lors du débogage.

(3) Incorporer nop énoncés dans le milieu de votre LINQ de la chaîne de sorte que vous pouvez définir des points d'arrêt, comme décrit précédemment par l'Incroyable Pete.

Dans mon article je vais vous donner une pléthore d'illustrations et d'exemples de code qui vous permettra de découvrir chacune de ces approches et plus.

[J'ai emprunté des pièces de cette réponse de l'autre AFIN que les réponse que j'ai fournie; la question de Débogage des Requêtes LINQ couvre eseentially le même sol.]

3voto

Judah Himango Points 27365

Vérifiez la trace de la pile d'exceptions et voyez le dernier bit de votre code exécuté.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X