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 MyFunction
gå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