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

Dotazy

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 customersdat a proměnnou custrozsahu .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. Typ londonCusts5 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 Byklauzuli Group By naleznete v tématu Klauzule Group By.

Viz také