Comment déboguer une Déclaration de 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;
Le 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?
MODIFIER Quand j'ai dit je sais pour un fait qu'il n'y a pas des objets null 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 style outil
- Quelle a été la réponse?
- 42. En fait, si vous avez lu mon edit, c'est que j'ai eu une référence null, malgré mon assurance du contraire
Vous devez vous connecter pour publier un commentaire.
Je ne suis pas sûr si c'est possible de débogage à partir de VS, mais je trouve LINQPad pour être tout à fait utile. Il va vous permettre de vider les résultats de chaque partie de la requête LINQ.
Oui, il est en effet possible de mettre en pause l'exécution à mi-chemin par le biais d'une requête linq.
Convertir votre requête linq to style à l'aide des expressions lambda et insérez une instruction Select qui retourne lui-même quelque part après le point dans le linq que vous souhaitez déboguer. Quelques exemples de code de la rendre plus claire -
Puis décommenter les lignes commentées. Assurez-vous que le {return i;} est sur sa propre ligne et insérez un debug point là. Vous pouvez mettre cela de sélectionner à tout moment dans votre long, compliqué d'une requête linq.
Vous devriez être en mesure de définir un point d'arrêt sur l'expression de la
where
clause de vos LINQ déclaration.Dans cet exemple, placez le curseur n'importe où dans la section de code suivante:
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 la fenêtre des points d'arrêt à 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.
J'ai écrit un article complet traitant de cette question très publié sur Simple-Talk.com (LINQ Secrets Révélés: le Chaînage et de Débogage) en 2010:
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. Bien que très utile, LINQPad est externe à Visual Studio. J'ai donc également présents plusieurs techniques disponibles pour une utilisation dans 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.
2016.12.01 mise à Jour
Et je viens d'écrire la suite de l'article ci-dessus, intitulé tout simplement LINQ de Débogage et de Visualisation, qui révèle que le vrai LINQ fonctionnalité de débogage est enfin arrivé dans Visual Studio 2015 avec le sujet-à-être-publié nouvelle fonctionnalité dans OzCode. @Dror, la réponse à cette question montre un petit aperçu de celui-ci, mais je vous encourage à lire mon nouvel article pour approfondir les "comment". (Et je ne pas travail pour OzCode.:-)
[Disclaimer: je travaille à OzCode]
Le problème avec LINQ, c'est qu'il est difficile, voire impossible, de débogage - même lorsqu'il s'agit des requêtes simples, un développeur est obligé de revoir sa requête à un tas de boucles foreach, ou de l'utilisation de la journalisation.
LINQ débogage est pris en charge dans un bientôt-à-être-publié version de OzCode (actuellement disponible en Accès anticipé Aperçu) et il permet aux développeurs de percer dans leur LINQ code et de repérer les endroits difficiles à attraper les exceptions à l'intérieur de requêtes
C'est ce que votre requête devrait ressembler à OzCode:
Il est possible à l'étape à l'intérieur de l'expression LINQ sans réglage temporaire des points d'arrêt. Vous avez besoin à l'étape dans la fonction qui évalue l'expression LINQ, par exemple:
.ToList()
Vérifier la trace de pile d'exception et de voir le dernier bit de votre code exécuté.
De la porte de l'erreur que je vous conseille de prendre un coup d'oeil à la ligne.Lignes et assurez-vous que le recenseur est correctement mis en place. Je pense qu'elle retourne null quand il ne devrait pas.
Oh, et assurez-vous que la ligne et de la ligne.Les lignes des objets ne sont pas null ou de retourner les valeurs null en tant que bien.
Alors que ce n'est pas un moyen de débogage, je vous suggère de l'aide:
Vous pouvez ensuite vérifier la fenêtre de sortie lors du débogage pour voir le SQL généré à partir de votre requête LINQ.