Freigeben über


Debuggen von LINQ

Visual Studio unterstützt das Debuggen von LINQ-Code (Language Integrated Query) mit einigen Einschränkungen. Die meisten Debugfeatures funktionieren mit LINQ-Anweisungen, einschließlich Schrittschritten, Festlegen von Haltepunkten und Anzeigen von Ergebnissen in Debuggerfenstern. In diesem Thema werden die wichtigsten Einschränkungen des LINQ-Debuggings beschrieben.

Anzeigen von LINQ-Ergebnissen

Sie können das Ergebnis einer LINQ-Anweisung mithilfe von DataTips, dem Überwachungsfenster und dem Dialogfeld QuickWatch anzeigen. Wenn Sie ein Quellfenster verwenden, können Sie den Zeiger in einer Abfrage im Quellfenster anhalten, und eine Dateninfo wird angezeigt. Sie können eine LINQ-Variable kopieren und in das Dialogfeld "Überwachung" oder "QuickWatch" einfügen.

In LINQ wird eine Abfrage nicht ausgewertet, wenn sie erstellt oder deklariert wird, sondern nur, wenn die Abfrage verwendet wird. Daher weist die Abfrage erst dann einen Wert auf, wenn sie ausgewertet wird. Eine vollständige Beschreibung der Erstellung und Auswertung von Abfragen finden Sie unter Einführung in LINQ-Abfragen (C#) oder Schreiben Ihrer ersten LINQ-Abfrage.

Um das Ergebnis einer Abfrage anzuzeigen, muss der Debugger es auswerten. Diese implizite Auswertung, die auftritt, wenn Sie ein LINQ-Abfrageergebnis im Debugger anzeigen, hat einige Effekte, die Sie berücksichtigen sollten:

  • Jede Auswertung der Abfrage dauert Zeit. Das Erweitern des Ergebnisknotens nimmt ebenfalls Zeit in Anspruch. Bei einigen Abfragen kann die wiederholte Auswertung zu einer spürbaren Leistungseinbuße führen.

  • Die Auswertung einer Abfrage kann zu Nebenwirkungen führen, bei denen es sich um Änderungen am Wert von Daten oder dem Status Ihres Programms handelt. Nicht alle Abfragen haben Nebenwirkungen. Um festzustellen, ob eine Abfrage ohne Nebenwirkungen sicher ausgewertet werden kann, müssen Sie den Code verstehen, der die Abfrage implementiert.

Schrittweise Ausführung und LINQ

Wenn Sie LINQ-Code debuggen, weist die schrittweise Ausführung teilweise ein abweichendes Verhalten auf, das Sie beachten sollten.

LINQ to SQL

In LINQ to SQL-Abfragen liegt der Prädikatcode über die Kontrolle des Debuggers hinaus. Daher können Sie nicht in den Prädikatcode wechseln. Jede Abfrage, die zu einem Ausdrucksbaum kompiliert wird, erzeugt Code, der außerhalb der Kontrolle des Debuggers liegt.

Schrittweise Ausführung in Visual Basic

Wenn Sie ein Visual Basic-Programm durchlaufen und der Debugger auf eine Abfragedeklaration trifft, tritt er nicht in die Deklaration ein, hebt jedoch die gesamte Deklaration als einzelne Anweisung hervor. Dieses Verhalten tritt auf, da die Abfrage erst ausgewertet wird, wenn sie aufgerufen wird. Weitere Informationen finden Sie unter Einführung in LINQ in Visual Basic.

Wenn Sie den folgenden Beispielcode durchlaufen, hebt der Debugger die Abfragedeklaration oder die Abfrageerstellung als einzelne Anweisung hervor.

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

Wenn Sie erneut schreiten, wird For Each cur In xvom Debugger hervorgehoben. Im nächsten Schritt wird in die Funktion MyFunctioneingetreten. Nach dem Durchlaufen von MyFunctionspringt es zurück zu Console.WriteLine(cur.ToSting()). An keinem Punkt durchläuft er den Prädikatcode in der Abfragedeklaration, obwohl der Debugger diesen Code auswertet.

Ersetzen eines Prädikats durch eine Funktion, um die schrittweise Ausführung zu ermöglichen (Visual Basic)

Wenn Sie prädikatcode für Debuggingzwecke durchlaufen müssen, können Sie das Prädikat durch einen Aufruf einer Funktion ersetzen, die den ursprünglichen Prädikatcode enthält. Angenommen, Sie haben diesen Code:

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

Sie können den Prädikatcode in eine neue Funktion verschieben, die als IsEvenbezeichnet wird:

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

Die überarbeitete Abfrage ruft bei jedem Durchlauf von items die IsEven-Funktion auf. Mit den Debuggerfenstern können Sie sehen, ob jedes Element die angegebene Bedingung erfüllt, und Sie können den Code in IsEvenschrittweise durchlaufen. Das Prädikat in diesem Beispiel ist ziemlich einfach. Wenn Sie jedoch ein schwierigeres Prädikat haben, das Sie debuggen müssen, kann diese Technik sehr nützlich sein.

LINQ unterstützt Bearbeiten und Fortsetzen nicht

Bearbeiten und Fortsetzen unterstützt Änderungen an LINQ-Abfragen mit Einschränkungen. Details finden Sie im Artikel zu den von EnC unterstützten Änderungen.