Megosztás a következőn keresztül:


LINQ hibakeresése

A Visual Studio bizonyos korlátozásokkal támogatja a nyelvi integrált lekérdezési (LINQ) kód hibakeresését. A legtöbb hibakeresési funkció LINQ-utasításokkal működik, beleértve a lépcsőzést, a töréspontok beállítását és az eredmények hibakereső ablakokban való megtekintését. Ez a témakör a LINQ-hibakeresés főbb korlátait ismerteti.

LINQ-eredmények megtekintése

A LINQ-utasítás eredményét az Adatleírások, a Figyelő ablak és a Gyorsóra párbeszédpanel használatával tekintheti meg. Ha forrásablakot használ, szüneteltetheti az egérmutatót egy lekérdezésen a forrásablakban, és megjelenik egy adatleírás. A LINQ-változót átmásolhatja és beillesztheti a Figyelés ablakba vagy a Gyorsóra párbeszédpanelre.

A LINQ-ban a lekérdezések létrehozásakor vagy deklarálásakor a rendszer nem értékeli ki a lekérdezést, csak akkor, ha a lekérdezést használják. Ezért a lekérdezés nem rendelkezik értékkel, amíg ki nem értékeli. A lekérdezések létrehozásának és kiértékelésének teljes leírását a Bevezetés a LINQ-lekérdezések (C#) vagy Az első LINQ-lekérdezés írásacímű témakörben talál.

A hibakeresőnek ki kell értékelnie a lekérdezést ahhoz, hogy annak eredményét megjeleníthesse. Ennek az implicit kiértékelésnek, amely a LINQ-lekérdezés eredményének a hibakeresőben való megtekintésekor fordul elő, figyelembe kell vennie néhány effektust:

  • A lekérdezés minden kiértékelése időt vesz igénybe. Az eredménycsomópont kibontása időt vesz igénybe. Egyes lekérdezések esetén az ismételt értékelés észrevehető teljesítménybírságot eredményezhet.

  • A lekérdezés kiértékelése mellékhatásokat okozhat, amelyek az adatok értékének vagy a program állapotának változásai. Nem minden lekérdezésnek vannak mellékhatásai. Annak megállapításához, hogy a lekérdezések biztonságosan kiértékelhetők-e mellékhatások nélkül, ismernie kell a lekérdezést megvalósító kódot.

Lépésről lépésre haladás és LINQ

A LINQ-kód hibakeresésekor a lépcsőzésnek van néhány viselkedésbeli különbsége, amiről tudnia kell.

LINQ to SQL

A LINQ-ból SQL-lekérdezésekbe a predikátumkód nem szabályozható a hibakereső számára. Ezért nem léphet a predikátumkódba. A kifejezésfára lefordított lekérdezések olyan kódot eredményeznek, amely nem szabályozható a hibakereső számára.

Lépéslépés a Visual Basicben

Amikor egy Visual Basic-programon lép át, és a hibakereső lekérdezési deklarációval találkozik, az nem lép a deklarációba, hanem egyetlen utasításként emeli ki a teljes deklarációt. Ez a viselkedés azért fordul elő, mert a lekérdezés nem lesz kiértékelve, amíg meg nem hívják. További információ: Bevezetés a LINQ és a Visual Basic témakörébe.

Ha végiglép a következő példakódon, a hibakereső egyetlen utasításként emeli ki a lekérdezésdeklarációt vagy a lekérdezés létrehozását.

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

Amikor ismét lép, a hibakereső kiemeli For Each cur In x. A következő lépésben belép a függvény MyFunction-ba. A MyFunctionlépése után visszaugrik a Console.WriteLine(cur.ToSting())-re. A lekérdezési deklaráció predikátumkódját egy ponton sem lépi át, bár a hibakereső kiértékeli ezt a kódot.

Predikátum helyettesítése egy függvénnyel a léptetés engedélyezéséhez (Visual Basic)

Ha hibakeresési célokból át kell haladnia a predikátumkódon, lecserélheti a predikátumot egy olyan függvény hívására, amely az eredeti predikátumkódot tartalmazza. Tegyük fel például, hogy rendelkezik ezzel a kóddal:

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

A predikátumkódot áthelyezheti egy új, IsEvennevű függvénybe:

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

A módosított lekérdezés az IsEvenminden iterációján meghívja a items függvényt. A hibakereső ablakokkal ellenőrizheti, hogy az egyes elemek megfelelnek-e a megadott feltételnek, és végiglépkedhet a kódon a IsEven-ban. A példában szereplő predikátum meglehetősen egyszerű. Azonban, ha van egy nehezebb predikátum, amit hibakeresned kell, ez a technika nagyon hasznos lehet.

A LINQ szerkesztése és folytatása nem támogatott.

A Szerkesztés és a Folytatás korlátozásokkal támogatja a LINQ-lekérdezések módosításait. További információ: EnC által támogatott módosítások