Débogage des Requêtes LINQ
Nous avons fait beaucoup de travail avec LINQ ces derniers temps, surtout dans une LINQ-to-Objets de sens. Malheureusement, certains de nos requêtes peut être un peu compliqué, surtout quand ils commencent à se comporter plusieurs séquences dans les combinaisons. Il peut être difficile de dire exactement ce qu'il se passe, quand vous obtenez les requêtes qui commencent à ressembler à:
IEnumerable<LongType> myCompanies = relevantBusiness.Children_Companies
.Select(ca => ca.PR_ContractItemId)
.Distinct()
.Select(id => new ContractedItem(id))
.Select(ci => ci.PR_ContractPcrId)
.Distinct()
.Select(id => new ContractedProdCompReg(id))
.Select(cpcr => cpcr.PR_CompanyId)
.Distinct();
var currentNewItems = myCompanies
.Where(currentCompanyId => !currentLic.Children_Appointments.Select(app => app.PR_CompanyId).Any(item => item == currentCompanyId))
.Select(currentId => new AppointmentStub(currentLic, currentId))
.Where(currentStub=>!existingItems.Any(existing=>existing.IsMatch(currentStub)));
Items = existingItems.Union(newItems).ToList();
etc., etc...
Même lorsque vous déboguez, il peut être difficile de dire qui fait quoi à qui et quand. Court de gratuitement en appelant "ToList" sur les séquences pour obtenir les choses que je peux examiner plus facilement, quelqu'un at-il de bonnes suggestions pour comment déboguer "compliqué" de LINQ?
OriginalL'auteur GWLlosa | 2009-06-04
Vous devez vous connecter pour publier un commentaire.
Comme une requête qui semble indiquer que, pour moi, que vous n'êtes pas fait un bon travail en choisissant des structures de données, ou de faire un bon travail avec l'encapsulation et la séparation des tâches. Je vous suggère de jeter un coup d'oeil et de le casser.
En général, cependant, si je veux débogage d'une requête LINQ qui n'est bien évidemment pas correct, j'avais la décomposer en sous-requêtes et d'examiner les résultats de l'un-à-un-temps dans le débogueur.
Peut qu'être d'accord. Avec LinqToObjects chaque étape de la chaîne sera effectivement vous donner un objet à travailler et étudier. Contrairement à LinqToSQL où l'évaluation de l'expression est retardée jusqu'à la fin, les méthodes d'extension dans LinqToObjects de travail à l'instar d'autres méthodes et d'évaluer immédiatement.
LINQ to Object requêtes utilisation différée de l'évaluation, de trop. Mais vous pouvez les évaluer pendant le débogage.
Est-il un moyen pour obtenir l'objet à évaluer maintenant"? Comme si j'ai un IEnumerable<T> c'est différée, est-il une '.Go () fonction que je peux faire appel à elle dans le débogueur pour vérifier son état actuel?
Comme pour la structure de l'objet, la meilleure expression pour décrire c'est "l'Héritage de Code en dehors de mon contrôle".
OriginalL'auteur mquander
Je sais, ma réponse est "un peu" de retard, mais je me devais de partager cette:
Viens de découvrir LinqPad et c'est INCROYABLE (pour ne pas dire gratuit).
Ne peux pas croire que j'ai écrit Linq pour si longtemps sans savoir à propos de cet outil.
Comme je le comprends, c'est le travail de l'auteur(s?) de O'Reilly "De C# 3.0, en un Mot" et "C# 4.0 dans une coquille de noix" .
OriginalL'auteur Cristi Diaconescu
Quand j'ai regardé autour de récemment pour les réponses à la même question, j'ai trouvé quelques intrigants conseils ici et là, mais pas de récit cohérent vraiment creuser dans la réponse à la question. J'ai donc écrit un moi-même, et il vient d'être publié sur Simple-Talk.com (LINQ Secrets Révélés: le Chaînage et de Débogage). Vous pourriez avoir besoin de s'inscrire pour lire l'article (site semble aller par le biais de quelques changements ces derniers jours) alors voici les faits saillants de l'article:
(1) Dans LINQPad: Utiliser 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 incroyable propre et claire de la mode.
(2) Dans Visual Studio: Intégrer 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. Remarque l'instruction de retour doit être sur sa propre ligne pour définir un point d'arrêt dans Visual Studio. (Merci à Eric Blanc de l'entrée de blog Débogage des Requêtes LINQ pour cette astuce.)
(3) Dans Visual Studio: 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.
(4) Enfin, (oui je suis amoureux de LINQPad de la méthode de Vidage!) apporter LINQPad de visualisation du droit dans Visual Studio avec Robert Ivanc de LINQPad Visualizer complément. Pas une solution parfaite (pas encore de support pour VS2010, nécessite classes sérialisables, quelques problèmes de rendu), mais il est tout à fait utile.
2016.12.01 mise à Jour
Vient d'être publié sur Simple-Talk.com est la suite de l'article ci-dessus: LINQ de Débogage et de Visualisation. Cet article fournit une couverture complète de la nouvelle LINQ fonctionnalité de débogage de la OzCode extension pour Visual Studio 2015. OzCode fait enfin LINQ débogage facile et puissant. (Et, non, je ne pas travail pour OzCode :-).
et maintenant, le visualiseur prend en charge les deux vs2010 et les classes qui ne sont pas sérialisables! 🙂
La meilleure réponse!
OriginalL'auteur Michael Sorens
Il n'y a pas de construire des outils, j'en suis conscient. Le meilleur que vous pouvez faire est de fractionnement de la requête en plusieurs sous-requêtes et de l'évaluation de ces sous-requêtes, tandis que le débogage. Un bon outil 3ème partie est LINQPad.
OriginalL'auteur Daniel Brückner
Ce blog a quelques très prometteur techniques pour le débogage de LINQ to Objects.
OriginalL'auteur Joel Mueller
Cheval Pommes!
Resharper (j'adore) m'a suggéré de modifier cette
à ce
Ouai, c'est très sexy et élégant, mais marcher à travers elle et le débogage? Vous ne pouvez pas le faire. Je reviens sur foreach pour celui-ci.
J'aime LinqPad trop et je ne pense Linq est assez impressionnant dans un "un anneau pour les gouverner tous" sorte de façon, mais dans ce cas, je perds quelque chose.
OriginalL'auteur SleepyBoBos