Partager via


Débogage LINQ

Visual Studio prend en charge le débogage du code LINQ (Language-Integrated Query), avec certaines restrictions. La plupart des fonctionnalités de débogage sont compatibles avec les instructions LINQ, notamment l'exécution pas à pas, la définition de points d'arrêt et la consultation de résultats dans les fenêtres du débogueur.Cette rubrique décrit les principales restrictions liées au débogage de LINQ.

Dans cette rubrique

Viewing LINQ Results

Décrit les circonstances particulières à prendre en compte lors de la consultation des résultats d'une requête LINQ dans le débogueur.

Stepping and LINQ

Explique le comportement d'exécution pas à pas lors du débogage de LINQ.

Edit and Continue Not Supported for LINQ

Explique le comportement à prévoir si vous tentez de modifier du code LINQ lors du débogage.

Résultats d'afficher LINQ

Vous pouvez consulter le résultat d'une instruction LINQ à l'aide des DataTips, de la fenêtre Espion et de la boîte de dialogue Espion express.Lorsque vous utilisez une fenêtre source, vous pouvez suspendre le pointeur sur une requête dans la fenêtre source pour afficher un DataTip.Vous pouvez copier une variable LINQ et la coller dans la fenêtre Espion ou dans la boîte de dialogue Espion express.

Dans LINQ, une requête n'est pas évaluée lorsqu'elle est créée ou déclarée, mais uniquement lors de son utilisation.Par conséquent, la requête ne possède de valeur que lorsqu'elle est évaluée.Pour obtenir une description complète de la création et de l'évaluation de requêtes, consultez Introduction aux requêtes LINQ (C#) ou Écriture de votre première requête LINQ (Visual Basic).

Pour afficher le résultat d'une requête, le débogueur doit l'évaluer.Cette évaluation implicite, qui se produit lorsque vous consultez le résultat d'une requête LINQ dans le débogueur, entraîne quelques effets dont vous devez tenir compte :

  • Chaque évaluation de la requête prend du temps.Le développement du nœud de résultats est long.Ainsi, pour certaines requêtes, une évaluation répétée peut diminuer considérablement les performances.

  • L'évaluation d'une requête peut provoquer des effets secondaires, à savoir des modifications de la valeur des données ou de l'état du programme.Toutefois, les requêtes ne présentent pas toutes des effets secondaires.Pour savoir si une requête peut être évaluée sans risque et sans effets secondaires, vous devez comprendre le code qui implémente la requête.

Progression et LINQ

Lorsque vous déboguez du code LINQ, la progression présente des différences de comportement que vous devez connaître.

Bb385795.collapse_all(fr-fr,VS.110).gifLINQ to SQL

Dans les requêtes LINQ to SQL, le code de prédicat n'est pas contrôlé par le débogueur.Par conséquent, vous ne pouvez pas effectuer d'exécution pas à pas du code de prédicat.Toute requête compilée en une arborescence de l'expression génère du code qui n'est pas contrôlé par le débogueur.

Bb385795.collapse_all(fr-fr,VS.110).gifExécution pas à pas dans Visual Basic

Lorsque vous exécutez un programme Visual Basic pas à pas, si le débogueur rencontre une déclaration de requête, il n'effectue pas de pas à pas détaillé dans la déclaration, mais met en surbrillance la déclaration entière en tant qu'instruction unique.Ce comportement se produit car la requête n'est évaluée que lorsqu'elle est appelée.Pour plus d'informations, consultez Introduction à LINQ dans Visual Basic.

Si vous effectuez un pas à pas dans l'exemple de code suivant, le débogueur met en surbrillance la déclaration de requête (Query creation) en tant qu'instruction unique.

Function MyFunction(ByVal x As Char)
    Return True
End Function

Sub Main()
    'Query creation
    Dim x = From it In "faoaoeua" _
            Where MyFunction(it) _
            Select New With {.a = it}

    ' Query execution
    For Each cur In x
        Console.WriteLine(cur.ToString())
    Next
End Sub

Lors de la prochaine exécution pas à pas, le débogueur met en surbrillance For Each cur In x.À l'étape suivante, il effectue un pas à pas détaillé dans la fonction MyFunction.Après la fonction MyFunction, il revient à Console.WriteLine(cur.ToSting()).À aucun moment, le débogueur n'effectue de pas à pas détaillé dans le code de prédicat dans la déclaration de requête, alors qu'il évalue ce code.

Bb385795.collapse_all(fr-fr,VS.110).gifRemplacement d'un prédicat par une fonction pour activer l'exécution pas à pas (Visual Basic)

Si vous devez effectuer un pas à pas détaillé d'un code de prédicat à des fins de débogage, vous pouvez remplacer le prédicat par un appel d'une fonction qui contient le code de prédicat d'origine.Par exemple, si vous avez le code suivant :

Dim items() as integer ={1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

' Get the even numbers
Dim query = From nextInt in items Where nextInt Mod 2 = 0 Select nextInt

For each item in query
      Console.WriteLine(item)
Next

Vous pouvez déplacer le code de prédicat vers une nouvelle fonction, appelée IsEven :

Dim items () as integer ={1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

' Get the even numbers
Dim query = From nextInt in items Where IsEven(nextInt) Select nextInt

For each item in query
      Console.WriteLine(item)
Next
... 
Function IsEven(item As =Integer) as Boolean
      Return item Mod 2 = 0
End Function

La requête modifiée appelle la fonction IsEven à chaque passe dans items.Vous pouvez utiliser les fenêtres du débogueur pour vérifier si chaque élément répond à la condition spécifiée. Vous pouvez également exécuter le code pas à pas dans IsEven.Dans cet exemple, le prédicat est assez simple.Toutefois, si vous devez déboguer un prédicat plus complexe, cette technique peut s'avérer très utile.

Modifiez et continuez non pris en charge pour LINQ

Modifier & Continuer ne prend pas en charge les modifications apportées aux requêtes LINQ.Si vous ajoutez, supprimez ou modifiez une instruction LINQ pendant une session de débogage, une boîte de dialogue s'affiche pour signaler que la modification n'est pas prise en charge par Modifier & Continuer.À ce stade, vous pouvez annuler les modifications apportées ou arrêter la session de débogage et redémarrer une nouvelle session avec le code modifié.

De plus, Modifier & Continuer ne prend pas en charge la modification du type ou de la valeur d'une variable utilisée dans une instruction LINQ.Ici aussi, vous pouvez annuler les modifications apportées ou arrêter et redémarrer la session de débogage.

En C#, vous ne pouvez pas utiliser Modifier & Continuer dans un code d'une méthode contenant une requête LINQ.

Dans Visual Basic, vous pouvez utiliser Modifier & Continuer dans du code non-LINQ, même dans une méthode contenant une requête LINQ.Vous pouvez ajouter ou supprimer du code avant l'instruction LINQ, même si les modifications apportées concernent le numéro de ligne de la requête LINQ.Votre expérience de débogage Visual Basic pour du code non-LINQ reste telle qu'elle était avant l'introduction de LINQ.Toutefois, vous ne pouvez pas modifier, ajouter ou supprimer une requête LINQ, sauf si vous voulez arrêter le débogage afin d'appliquer les modifications apportées.

Voir aussi

Concepts

Effets secondaires et expressions

Gestion des exceptions (débogage)

Introduction aux requêtes LINQ (C#)

Introduction à LINQ dans Visual Basic

Autres ressources

Debugging SQL

Préparation du débogage : projets SQL Server