Základní operace dotazů (Visual Basic)
Toto téma obsahuje stručný úvod do výrazů LINQ (Language-Integrated Query) v jazyce Visual Basic a některé z typických typů operací, které v dotazu provedete. Další informace naleznete v následujících tématech:
Úvod do LINQ v jazyce Visual Basic
Návod: Zápis dotazů v jazyce Visual Basic
Určení zdroje dat (From)
V dotazu LINQ je prvním krokem zadání zdroje dat, který chcete dotazovat. Proto klauzule From
v dotazu vždy přichází jako první. Operátory dotazu vyberou a tvaruje výsledek na základě typu zdroje.
Dim query = From cust In customers
' ...
Klauzule určuje zdroj customers
dat a proměnnou cust
rozsahu .From
Proměnná rozsahu se podobá proměnné iterace smyčky s tím rozdílem, že ve výrazu dotazu nedojde k žádné skutečné iteraci. Při spuštění dotazu, často pomocí For Each
smyčky, slouží proměnná rozsahu jako odkaz na každý po sobě jdoucí prvek v customers
. Vzhledem k tomu, že kompilátor může odvodit typ cust
, nemusíte ho explicitně zadávat. Příklady dotazů napsaných pomocí explicitního psaní a bez explicitního psaní najdete v tématu Relace typů v operacích dotazů (Visual Basic).
Další informace o použití From
klauzule v jazyce Visual Basic naleznete v tématu From Klauzule.
Filtrování dat (Where)
Nejběžnější operací dotazu je použití filtru ve formě logického výrazu. Dotaz pak vrátí pouze ty prvky, pro které je výraz pravdivý. K Where
filtrování se používá klauzule. Filtr určuje, které prvky ve zdroji dat se mají zahrnout do výsledné sekvence. V následujícím příkladu jsou zahrnuti pouze zákazníci, kteří mají adresu v Londýně.
Dim londonCusts = From cust In customers
Where cust.City = "London"
' ...
Můžete použít logické operátory, jako And
je a Or
kombinovat výrazy filtru v Where
klauzuli. Pokud například chcete vrátit jenom ty zákazníky, kteří jsou z Londýna a jejichž jméno je Devon, použijte následující kód:
Where cust.City = "London" And cust.Name = "Devon"
Pokud chcete vrátit zákazníky z Londýna nebo Paříže, použijte následující kód:
Where cust.City = "London" Or cust.City = "Paris"
Další informace o použití Where
klauzule v jazyce Visual Basic naleznete v tématu Where Klauzule.
Řazení dat (Order By)
Často je vhodné řadit vrácená data do určitého pořadí. Klauzule Order By
způsobí, že se prvky ve vrácené sekvenci seřadí podle zadaného pole nebo polí. Například následující dotaz seřadí výsledky podle Name
vlastnosti. Protože Name
je řetězec, vrácená data budou seřazena abecedně od A do Z.
Dim londonCusts1 = From cust In customers
Where cust.City = "London"
Order By cust.Name Ascending
' ...
Pokud chcete výsledky uspořádat v opačném pořadí, od Z do A, použijte klauzuli Order By...Descending
. Výchozí hodnota je Ascending
, pokud Ascending
není zadána ani Descending
není zadána.
Další informace o použití Order By
klauzule v jazyce Visual Basic naleznete v části Order By Klauzule.
Výběr dat (Select)
Klauzule Select
určuje formulář a obsah vrácených prvků. Můžete například určit, jestli se výsledky budou skládat z úplných Customer
objektů, pouze jedné Customer
vlastnosti, podmnožina vlastností, kombinace vlastností z různých zdrojů dat nebo z nějakého nového typu výsledku na základě výpočtu. Select
Když klauzule vytvoří něco jiného než kopii zdrojového prvku, operace se nazývá projekce.
Pokud chcete načíst kolekci, která se skládá z úplných Customer
objektů, vyberte samotnou proměnnou rozsahu:
Dim londonCusts2 = From cust In customers
Where cust.City = "London"
Order By cust.Name Ascending
Select cust
Customer
Pokud je instance velký objekt, který obsahuje mnoho polí a vše, co chcete načíst, je název, můžete vybrat cust.Name
, jak je znázorněno v následujícím příkladu. Odvození místního typu rozpozná, že se tím změní typ výsledku z kolekce Customer
objektů na kolekci řetězců.
Dim londonCusts3 = From cust In customers
Where cust.City = "London"
Order By cust.Name Ascending
Select cust.Name
Pokud chcete ze zdroje dat vybrat více polí, máte dvě možnosti:
Select
V klauzuli zadejte pole, která chcete zahrnout do výsledku. Kompilátor definuje anonymní typ, který má tato pole jako jeho vlastnosti. Další informace naleznete v tématu Anonymní typy.Vzhledem k tomu, že vrácené prvky v následujícím příkladu jsou instance anonymního typu, nelze odkazovat na typ podle názvu jinde v kódu. Název kompilátoru určený pro typ obsahuje znaky, které nejsou platné v normálním kódu jazyka Visual Basic. V následujícím příkladu jsou prvky v kolekci vrácené dotazem
londonCusts4
instance anonymního typu.Dim londonCusts4 = From cust In customers Where cust.City = "London" Order By cust.Name Ascending Select Name = cust.Name, Phone = cust.Phone For Each londonCust In londonCusts4 Console.WriteLine(londonCust.Name & " " & londonCust.Phone) Next
nebo
Definujte pojmenovaný typ, který obsahuje konkrétní pole, která chcete zahrnout do výsledku
Select
, a vytvořte a inicializovat instance typu v klauzuli. Tuto možnost použijte pouze v případě, že potřebujete použít jednotlivé výsledky mimo kolekci, ve které jsou vráceny, nebo pokud je musíte předat jako parametry ve volání metody. TyplondonCusts5
v následujícím příkladu je IEnumerable(Of Name Telefon).Public Class NamePhone Public Name As String Public Phone As String ' Additional class elements End Class
Dim londonCusts5 = From cust In customers Where cust.City = "London" Order By cust.Name Ascending Select New NamePhone With {.Name = cust.Name, .Phone = cust.Phone}
Další informace o použití Select
klauzule v jazyce Visual Basic naleznete v tématu Select Clause.
Spojování dat (Join a Group Join)
V klauzuli From
můžete zkombinovat více než jeden zdroj dat několika způsoby. Následující kód například používá dva zdroje dat a implicitně kombinuje vlastnosti z obou z nich ve výsledku. Dotaz vybere studenty, jejichž příjmení začínají samohláskou.
Dim vowels() As String = {"A", "E", "I", "O", "U"}
Dim vowelNames = From student In students, vowel In vowels
Where student.Last.IndexOf(vowel) = 0
Select Name = student.First & " " &
student.Last, Initial = vowel
Order By Initial
For Each vName In vowelNames
Console.WriteLine(vName.Initial & ": " & vName.Name)
Next
Poznámka:
Tento kód můžete spustit se seznamem studentů vytvořených v části Postupy: Vytvoření seznamu položek.
Klíčové Join
slovo je ekvivalentem jazyka INNER JOIN
SQL. Kombinuje dvě kolekce na základě odpovídajících hodnot klíče mezi prvky v obou kolekcích. Dotaz vrátí všechny prvky kolekce nebo jeho část, které mají odpovídající hodnoty klíče. Následující kód například duplikuje akci předchozího implicitního spojení.
Dim vowelNames2 = From student In students
Join vowel In vowels
On student.Last(0) Equals vowel
Select Name = student.First & " " &
student.Last, Initial = vowel
Order By Initial
Group Join
kombinuje kolekce do jedné hierarchické kolekce, stejně jako LEFT JOIN
v SQL. Další informace naleznete v tématu Join Klauzule a Group Join Klauzule.
Seskupování dat (Group By)
Můžete přidat Group By
klauzuli, která seskupí prvky ve výsledku dotazu podle jednoho nebo více polí prvků. Například následující kód seskupuje studenty podle ročníku předmětu.
Dim studentsByYear = From student In students
Select student
Group By year = student.Year
Into Classes = Group
For Each yearGroup In studentsByYear
Console.WriteLine(vbCrLf & "Year: " & yearGroup.year)
For Each student In yearGroup.Classes
Console.WriteLine(" " & student.Last & ", " & student.First)
Next
Next
Pokud tento kód spustíte pomocí seznamu studentů vytvořených v části Postupy: Vytvoření seznamu položek, výstup z For Each
tohoto příkazu:
Rok: Junior
Tucker, Michael
Garcia, Hugo
Garcia, Debra
Tucker, Lance
Rok: Senior
Omelchenko, Svetlana
Osada, Michiko
Fakhouri, Fadi
Feng, Hanying
Adams, Terry
Rok: Freshman
Mortensen, Sven
Garcia, Cesar
Varianta zobrazená v následujícím kódu objedná roky předmětu a pak studenty objednává do každého roku podle příjmení.
Dim studentsByYear2 = From student In students
Select student
Order By student.Year, student.Last
Group By year = student.Year
Into Classes = Group
Další informace o Group By
klauzuli Group By naleznete v tématu Klauzule Group By.