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 MyFunction
binnengegaan. Na het doorlopen van MyFunction
springt 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, IsEven
genoemd:
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 IsEven
doorlopen. 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