Delen via


Foutopsporing LINQ

Visual Studio ondersteunt de foutopsporing van LINQ-code (Language Integrated Query), met enkele beperkingen. De meeste functies voor foutopsporing werken met LINQ-instructies, waaronder stappen, het instellen van onderbrekingspunten en het weergeven van resultaten in foutopsporingsvensters. In dit onderwerp worden de belangrijkste beperkingen van LINQ-foutopsporing beschreven.

LINQ-resultaten weergeven

U kunt het resultaat van een LINQ-instructie weergeven met behulp van DataTips, het venster Controle en het dialoogvenster QuickWatch. Wanneer u een bronvenster gebruikt, kunt u de aanwijzer op een query in het bronvenster onderbreken en wordt er een DataTip weergegeven. U kunt een LINQ-variabele kopiëren en in het venster Watch of het dialoogvenster QuickWatch plakken.

In LINQ wordt een query niet geëvalueerd wanneer deze wordt gemaakt of gedeclareerd, maar alleen wanneer de query wordt gebruikt. Daarom heeft de query geen waarde totdat deze wordt geëvalueerd. Zie Inleiding tot LINQ-query's (C#) of Uw eerste LINQ-query schrijvenvoor een volledige beschrijving van het maken en evalueren van query's.

Als u het resultaat van een query wilt weergeven, moet het foutopsporingsprogramma deze evalueren. Deze impliciete evaluatie, die optreedt wanneer u een LINQ-queryresultaat in het foutopsporingsprogramma bekijkt, heeft enkele effecten die u moet overwegen:

  • Elke evaluatie van de query kost tijd. Het uitbreiden van het resultatenknooppunt kost tijd. Voor sommige query's kan herhaalde evaluatie leiden tot een merkbare prestatiestraf.

  • Het evalueren van een query kan leiden tot bijwerkingen, die wijzigingen zijn in de waarde van gegevens of de status van uw programma. Niet alle query's hebben bijwerkingen. Als u wilt bepalen of een query veilig kan worden geëvalueerd zonder bijwerkingen, moet u de code begrijpen waarmee de query wordt geïmplementeerd.

Stappen en LINQ

Wanneer u LINQ-code aan het debuggen bent, zijn er enkele gedragsverschillen bij het doorstappen die u moet kennen.

LINQ naar SQL

In LINQ naar SQL-query's valt de predicaatcode buiten het beheer van het foutopsporingsprogramma. Daarom kunt u niet instappen in de predicaatcode. Elke query die wordt gecompileerd naar een expressiestructuur produceert code die buiten het beheer van het foutopsporingsprogramma valt.

Uitvoeren in Visual Basic

Wanneer u een Visual Basic-programma doorloopt en het foutopsporingsprogramma een querydeclaratie tegenkomt, wordt de declaratie niet doorgelopen, maar wordt de hele declaratie gemarkeerd als één instructie. Dit gedrag treedt op omdat de query pas wordt geëvalueerd als deze wordt aangeroepen. Zie Inleiding tot LINQ in Visual Basicvoor meer informatie.

Als u de volgende voorbeeldcode doorloopt, markeert het foutopsporingsprogramma de querydeclaratie of het maken van query's als één instructie.

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

Wanneer u opnieuw doorstapt, markeert de debugger For Each cur In x. In de volgende stap wordt de functie MyFunctionbinnengegaan. Na het doorlopen van MyFunctionspringt het terug naar Console.WriteLine(cur.ToSting()). Op geen enkel moment doorloopt het de predicaatcode in de querydeclaratie, hoewel het foutopsporingsprogramma die code wel evalueert.

Een predicaat vervangen door een functie om stappen in te schakelen (Visual Basic)

Als u predicaatcode moet doorlopen voor foutopsporing, kunt u het predicaat vervangen door een aanroep naar een functie die de oorspronkelijke predicaatcode bevat. Stel dat u deze code hebt:

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

U kunt de predicaatcode verplaatsen naar een nieuwe functie, IsEvengenoemd:

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

Met de herziene query wordt de functie IsEven aangeroepen bij elke herhaling door de items. U kunt de foutopsporingsprogrammavensters gebruiken om te zien of elk item voldoet aan de opgegeven voorwaarde en u kunt de code in IsEvendoorlopen. Het predicaat in dit voorbeeld is vrij eenvoudig. Echter, als u een moeilijkere voorwaarde moet debuggen, kan deze techniek erg nuttig zijn.

Bewerken en doorgaan niet ondersteund voor LINQ

Bewerken en Doorgaan ondersteunt wijzigingen in LINQ-query's met beperkingen. Zie EnC Ondersteunde wijzigingen voor meer informatie