Ladění LINQ
Visual Studio podporuje ladění kódu LINQ (Language Integrated Query) s určitými omezeními. Většina funkcí ladění funguje s příkazy LINQ, včetně krokování, nastavení zarážek a zobrazení výsledků v oknech ladicího programu. Toto téma popisuje hlavní omezení ladění LINQ.
Zobrazení výsledků LINQ
Výsledek příkazu LINQ můžete zobrazit pomocí dat Tipy, okna kukátka a dialogového okna QuickWatch. Když použijete zdrojové okno, můžete ukazatel na dotazu pozastavit v okně zdroje a zobrazí se popis dat. Proměnnou LINQ můžete zkopírovat a vložit ji do okna kukátka nebo dialogového okna QuickWatch.
V LINQ se dotaz nevyhodnocuje při vytváření nebo deklaraci, ale pouze při použití dotazu. Dotaz proto nemá hodnotu, dokud se nevyhodnotí. Úplný popis vytvoření a vyhodnocení dotazu najdete v tématu Úvod do dotazů LINQ (C#) nebo Zápis prvního dotazu LINQ.
Aby se zobrazil výsledek dotazu, musí ho ladicí program vyhodnotit. Toto implicitní vyhodnocení, ke kterému dochází při zobrazení výsledku dotazu LINQ v ladicím programu, má několik efektů, které byste měli zvážit:
Každé vyhodnocení dotazu nějakou dobu trvá. Rozšíření uzlu výsledků nějakou dobu trvá. U některých dotazů může opakované vyhodnocení vést k výraznému snížení výkonu.
Vyhodnocení dotazu může mít za následek vedlejší účinky, které se změní na hodnotu dat nebo stav programu. Ne všechny dotazy mají vedlejší účinky. Pokud chcete zjistit, jestli se dotaz může bezpečně vyhodnotit bez vedlejších účinků, musíte pochopit kód, který dotaz implementuje.
Krokování a LINQ
Při ladění kódu LINQ má krokování určité rozdíly chování, o kterých byste měli vědět.
Technologie LINQ to SQL
V dotazech LINQ to SQL je predikát kód mimo kontrolu ladicího programu. Proto nelze krokovat do predikátu kódu. Jakýkoli dotaz, který se zkompiluje do stromu výrazů, vytvoří kód, který je nad kontrolou ladicího programu.
Krokování v jazyce Visual Basic
Když procházíte program jazyka Visual Basic a ladicí program narazí na deklaraci dotazu, nezakročí do deklarace, ale zvýrazní celou deklaraci jako jediný příkaz. K tomuto chování dochází, protože dotaz není vyhodnocen, dokud se nevolá. Další informace naleznete v tématu Úvod do LINQ v jazyce Visual Basic.
Pokud projdete následující ukázkový kód, ladicí program zvýrazní deklaraci dotazu nebo vytvoření dotazu jako jeden příkaz.
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
Při dalším kroku se ladicí program zvýrazní For Each cur In x
. V dalším kroku přejde do funkce MyFunction
. Po krokování MyFunction
, přeskočí zpět na Console.WriteLine(cur.ToSting())
. V žádném okamžiku neprojde predikát kód v deklaraci dotazu, i když ladicí program tento kód vyhodnotí.
Nahrazení predikátu funkcí pro povolení krokování (Visual Basic)
Pokud potřebujete projít predikát kódu pro účely ladění, můžete predikát nahradit voláním funkce, která obsahuje původní predikát kódu. Předpokládejme například, že máte tento kód:
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
Predikátový kód můžete přesunout do nové funkce s názvem 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
Revidovaný dotaz volá funkci IsEven
při každém průchodu items
. Pomocí oken ladicího programu můžete zjistit, zda každá položka splňuje zadanou podmínku, a můžete procházet kód v IsEven
souboru . Predikát v tomto příkladu je poměrně jednoduchý. Pokud ale máte složitější predikát, který musíte ladit, může být tato technika velmi užitečná.
Funkce Upravit a pokračovat se nepodporuje pro LINQ
Funkce Upravit a pokračovat podporuje změny dotazů LINQ s omezeními. Podrobnosti najdete v tématu Podporované změny enC