Dela via


Felsökning av LINQ

Visual Studio stöder felsökning av LINQ-kod (language integrated query) med vissa begränsningar. Felsökningsfunktioner fungerar med LINQ-instruktioner, inklusive stegvis körning, inställning av brytpunkter och visning av resultat i felsökningsfönster. I det här avsnittet beskrivs de viktigaste begränsningarna för LINQ-felsökning.

Visa LINQ-resultat

Du kan visa resultatet av en LINQ-instruktion med hjälp av DataTips, bevakningsfönstret och dialogrutan QuickWatch. När du använder ett källfönster kan du pausa pekaren på en fråga i källfönstret så visas en DataTip. Du kan kopiera en LINQ-variabel och klistra in den i dialogrutan Klocka eller QuickWatch.

I LINQ utvärderas inte en fråga när den skapas eller deklareras, utan bara när frågan används. Frågan har därför inget värde förrän den utvärderas. En fullständig beskrivning av skapande och utvärdering av frågor finns i Introduktion till LINQ-frågor (C#) eller Skriva din första LINQ-fråga.

Om du vill visa resultatet av en fråga måste felsökaren utvärdera den. Den här implicita utvärderingen, som inträffar när du visar ett LINQ-frågeresultat i felsökningsprogrammet, har några effekter som du bör tänka på:

  • Varje utvärdering av frågan tar tid. Det tar tid att expandera resultatnoden. För vissa frågeställningar kan upprepad utvärdering resultera i en märkbar prestandaförsämring.

  • Utvärdering av en fråga kan resultera i biverkningar, som är ändringar i värdet för data eller programmets tillstånd. Alla sökfrågor har inte sidoeffekter. För att avgöra om en fråga kan utvärderas på ett säkert sätt utan biverkningar måste du förstå koden som implementerar frågan.

Step och LINQ

När du felsöker LINQ-kod har genomgång vissa beteendemässiga skillnader som du bör känna till.

LINQ till SQL

I LINQ till SQL-frågor ligger predikatkoden utanför felsökningsprogrammets kontroll. Därför kan du inte gå in i predikatkoden. Alla frågor som kompileras till ett uttrycksträd genererar kod som ligger utanför felsökningsprogrammets kontroll.

Stega i Visual Basic

När du går igenom ett Visual Basic-program och felsökningsprogrammet stöter på en frågedeklaration går det inte in i deklarationen utan markerar hela deklarationen som en enda instruktion. Det här beteendet beror på att frågan inte utvärderas förrän den anropas. Mer information finns i Introduktion till LINQ i Visual Basic.

Om du går igenom följande exempelkod markerar felsökningsprogrammet frågedeklarationen eller frågeskapandet som en enda instruktion.

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

När du fortsätter, markerar felsökaren For Each cur In x. I nästa steg stegar den in i funktionen MyFunction. När du har gått igenom MyFunctiongår den tillbaka till Console.WriteLine(cur.ToSting()). Det går inte vid något tillfälle igenom predikatkoden i frågedeklarationen, även om felsökaren utvärderar koden.

Ersätta ett predikat med en funktion för att möjliggöra steg-för-steg-körning (Visual Basic)

Om du måste gå igenom predikatkod i felsökningssyfte kan du ersätta predikatet med ett anrop till en funktion som innehåller den ursprungliga predikatkoden. Anta till exempel att du har den här koden:

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

Du kan flytta predikatkoden till en ny funktion med namnet 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

Den ändrade frågan anropar funktionen IsEven för varje pass genom items. Du kan använda felsökningsfönstren för att se om varje objekt uppfyller det angivna villkoret och du kan gå igenom koden i IsEven. Predikatet i det här exemplet är ganska enkelt. Men om du har ett svårare predikat som du måste felsöka kan den här tekniken vara mycket användbar.

Redigera och fortsätt stöds inte för LINQ

Redigera och fortsätt stöder ändringar i LINQ-frågor med begränsningar. För mer information, se Ändringar som stöds