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 On
Off
. 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 Where
jsou , Select
, Order By
, Take While
a 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.