Funkce Visual Basic podporující LINQ

Název LINQ (Language-Integrated Query) odkazuje na technologii jazyka Visual Basic, která podporuje syntaxi dotazů a další jazykové konstrukty přímo v jazyce. Pomocí LINQ se nemusíte učit nový jazyk pro dotazování na externí zdroj dat. Pomocí jazyka Visual Basic můžete dotazovat na data v relačních databázích, úložištích XML nebo objektech. Tato integrace možností dotazů do jazyka umožňuje kontrolu chyb syntaxe a bezpečnosti typů při kompilaci. Tato integrace také zajišťuje, že už znáte většinu toho, co potřebujete vědět k psaní bohatých a různorodých dotazů v jazyce Visual Basic.

Následující části popisují jazykové konstrukce, které podporují LINQ dostatečně podrobně, abyste mohli začít číst úvodní dokumentaci, příklady kódu a ukázkové aplikace. Můžete také kliknout na odkazy a najít podrobnější vysvětlení toho, jak se jazykové funkce spojí, aby se povolil jazykově integrovaný dotaz. Dobrým místem, kde začít, je Návod: Psaní dotazů v jazyce Visual Basic.

Výrazy dotazu

Výrazy dotazů v jazyce Visual Basic lze vyjádřit deklarativní syntaxí podobnou výrazu SQL nebo XQuery. V době kompilace je syntaxe dotazu převedena na volání metody volání LINQ zprostředkovatele implementace standardních metod operátoru dotazu. Aplikace určují, které standardní operátory dotazů jsou v oboru, zadáním příslušného Imports oboru názvů pomocí příkazu. Syntaxe výrazu dotazu jazyka Visual Basic vypadá takto:

Dim londonCusts = From cust In customers
                  Where cust.City = "London"
                  Order By cust.Name Ascending
                  Select cust.Name, cust.Phone

Další informace naleznete v tématu Úvod do LINQ v jazyce Visual Basic.

Implicitně zadané proměnné

Místo explicitního zadání typu při deklaraci a inicializaci proměnné můžete kompilátoru povolit odvození a přiřazení typu. Označuje se jako odvození místního typu.

Proměnné, jejichž typy jsou odvozeny, jsou silného typu, stejně jako proměnné, jejichž typ zadáte explicitně. Odvození místního typu funguje pouze v případech, kdy definujete místní proměnnou uvnitř těla metody. Další informace naleznete v tématu Příkaz odvození možnosti a odvození místního typu.

Následující příklad znázorňuje odvození místního typu. Chcete-li použít tento příklad, musíte nastavit Option Infer na On.

' The variable aNumber will be typed as an integer.
Dim aNumber = 5

' The variable aName will be typed as a String.
Dim aName = "Virginia"

Odvození místního typu také umožňuje vytvořit anonymní typy, které jsou popsány dále v této části a jsou nezbytné pro dotazy LINQ.

V následujícím příkladu LINQ dochází k odvození typu, pokud Option Infer je nebo OnOff. K chybě v době kompilace dochází, pokud Option Infer je Off a Option Strict je On.

' Query example.
' If numbers is a one-dimensional array of integers, num will be typed
' as an integer and numQuery will be typed as IEnumerable(Of Integer)--
' basically a collection of integers.

Dim numQuery = From num In numbers
               Where num Mod 2 = 0
               Select num

Inicializátory objektů

Inicializátory objektů se používají ve výrazech dotazu, když potřebujete vytvořit anonymní typ pro uložení výsledků dotazu. Lze je také použít k inicializaci objektů pojmenovaných typů mimo dotazy. Pomocí inicializátoru objektů můžete inicializovat objekt na jednom řádku bez explicitního volání konstruktoru. Za předpokladu, že máte třídu s názvem Customer veřejné Name a Phone vlastnosti, spolu s dalšími vlastnostmi, lze inicializátor objektů použít tímto způsobem:

Dim aCust = New Customer With {.Name = "Mike",
                               .Phone = "555-0212"}

Další informace naleznete v tématu Inicializátory objektů: pojmenované a anonymní typy.

Anonymní typy

Anonymní typy poskytují pohodlný způsob, jak dočasně seskupit sadu vlastností do elementu, který chcete zahrnout do výsledku dotazu. To umožňuje zvolit libovolnou kombinaci dostupných polí v dotazu v libovolném pořadí bez definování pojmenovaného datového typu pro prvek.

Anonymní typ je vytvořen dynamicky kompilátorem. Název typu je přiřazen kompilátorem a může se změnit s každou novou kompilací. Název proto nelze použít přímo. Anonymní typy se inicializují následujícím způsobem:

' Outside a query.
Dim product = New With {.Name = "paperclips", .Price = 1.29}

' Inside a query.
' You can use the existing member names of the selected fields, as was
' shown previously in the Query Expressions section of this topic.
Dim londonCusts1 = From cust In customers
                   Where cust.City = "London"
                   Select cust.Name, cust.Phone

' Or you can specify new names for the selected fields.
Dim londonCusts2 = From cust In customers
                   Where cust.City = "London"
                   Select CustomerName = cust.Name,
                   CustomerPhone = cust.Phone

Další informace naleznete v tématu Anonymní typy.

Metody rozšíření

Rozšiřující metody umožňují přidávat metody do datového typu nebo rozhraní mimo definici. Tato funkce umožňuje v podstatě přidávat nové metody do existujícího typu bez skutečné úpravy typu. Standardní operátory dotazů jsou samy o sobě sadou rozšiřujících metod, které poskytují linQ funkce dotazu pro libovolný typ, který implementuje IEnumerable<T>. Další rozšíření, která mají IEnumerable<T> být zahrnuta Count, Uniona Intersect.

Následující rozšiřující metoda přidá metodu tisku do String třídy.

' Import System.Runtime.CompilerServices to use the Extension attribute.
<Extension()>
Public Sub Print(ByVal str As String)
    Console.WriteLine(str)
End Sub

Metoda se nazývá jako běžná metoda Stringinstance :

Dim greeting As String = "Hello"
greeting.Print()

Další informace naleznete v tématu Metody rozšíření.

Lambda – výrazy

Výraz lambda je funkce bez názvu, který vypočítá a vrátí jednu hodnotu. Na rozdíl od pojmenovaných funkcí lze výraz lambda definovat a spustit současně. Následující příklad zobrazí 4.

Console.WriteLine((Function(num As Integer) num + 1)(3))

Definici výrazu lambda můžete přiřadit k názvu proměnné a pak ho použít k volání funkce. Následující příklad také zobrazí 4.

Dim add1 = Function(num As Integer) num + 1
Console.WriteLine(add1(3))

V LINQ jsou výrazy lambda základem mnoha standardních operátorů dotazu. Kompilátor vytvoří výrazy lambda pro zachycení výpočtů, které jsou definovány v základních metodách dotazů, jako Wherejsou , Select, Order By, Take Whilea další.

Následující kód například definuje dotaz, který vrátí všechny starší studenty ze seznamu studentů.

Dim seniorsQuery = From stdnt In students
                   Where stdnt.Year = "Senior"
                   Select stdnt

Definice dotazu je zkompilována do kódu, který je podobný následujícímu příkladu, který používá dva výrazy lambda k určení argumentů pro Where a Select.

Dim seniorsQuery2 = students.
    Where(Function(st) st.Year = "Senior").
    Select(Function(s) s)

Některou verzi je možné spustit pomocí smyčky For Each :

For Each senior In seniorsQuery
    Console.WriteLine(senior.Last & ", " & senior.First)
Next

Další informace najdete v tématu Výrazy lambda.

Viz také