Návod: Zápis dotazů ve Visual Basic

tento návod ukazuje, jak lze použít funkce jazyka Visual Basic k zápisu výrazů dotazů Language-Integrated dotazu (LINQ). Návod ukazuje, jak vytvořit dotazy na seznam objektů studenta, jak spustit dotazy a jak je upravit. Dotazy obsahují několik funkcí, včetně inicializátorů objektů, místního typu odvození a anonymních typů.

Po dokončení tohoto Názorného postupu budete připraveni přejít k ukázkám a dokumentaci pro konkrétního poskytovatele LINQ, kterého vás zajímá. poskytovatelé LINQ zahrnují Technologie LINQ to SQL , LINQ to DataSet a LINQ to XML.

Vytvoření Project

Vytvoření projektu konzolové aplikace

  1. Spusťte Visual Studio.

  2. V nabídce soubor přejděte na příkaz Nový a poté klikněte na možnost Project.

  3. V seznamu Nainstalované šablony klikněte na Visual Basic.

  4. V seznamu typů projektů klikněte na Konzolová aplikace. Do pole název zadejte název projektu a klikněte na tlačítko OK.

    Vytvoří se projekt. Ve výchozím nastavení obsahuje odkaz na System.Core.dll. také seznam importovaných oborů názvů na stránce s odkazy, Project Designer (Visual Basic) obsahuje System.Linq obor názvů.

  5. na stránce kompilovat Project Designer (Visual Basic)zajistěte, aby byla možnost odvoditelné nastavená na hodnotu On.

Přidání zdroje dat v paměti

Zdroj dat pro dotazy v tomto návodu je seznam Student objektů. Každý Student objekt obsahuje křestní jméno, příjmení, rok třídy a akademickou hodnost v těle studenta.

Přidání zdroje dat

  • Definujte Student třídu a vytvořte seznam instancí třídy.

    Důležité

    Kód potřebný k definování Student třídy a vytvoření seznamu, který se používá v příkladech návodu, je uveden v tématu Postupy: vytvoření seznamu položek. Můžete z něj zkopírovat a vložit ho do projektu. Nový kód nahradí kód, který se zobrazil při vytváření projektu.

Přidání nového studenta do seznamu studentů

Vytvoření dotazu

Po spuštění se dotaz přidaný v této části vytvoří seznam studentů, jejichž školní řazení je v prvních deseti. Vzhledem k tomu, že dotaz vybírá úplný Student objekt pokaždé, typ výsledku dotazu je IEnumerable(Of Student) . Nicméně typ dotazu obvykle není zadán v definicích dotazů. Místo toho kompilátor používá odvození místního typu k určení typu. Další informace naleznete v tématu odvození místního typu. Proměnná rozsahu dotazu currentStudent slouží jako odkaz na každou Student instanci ve zdroji, students a poskytuje přístup k vlastnostem každého objektu v students .

Vytvoření jednoduchého dotazu

  1. Vyhledejte místo v Main metodě projektu, který je označen následujícím způsobem:

    ' ****Paste query and query execution code from the walkthrough,
    ' ****or any code of your own, here in Main.
    

    Zkopírujte následující kód a vložte ho do.

    Dim studentQuery = From currentStudent In students
                       Where currentStudent.Rank <= 10
                       Select currentStudent
    
  2. Umístěte ukazatel myši nad studentQuery v kódu a ověřte, zda je typ přiřazený kompilátorem IEnumerable(Of Student) .

Spuštění dotazu

Proměnná studentQuery obsahuje definici dotazu, nikoli výsledky spuštění dotazu. Typickým mechanismem pro spuštění dotazu je For Each smyčka. Každý prvek v vrácené sekvenci je k dispozici prostřednictvím proměnné iterace smyčky. Další informace o provádění dotazů naleznete v tématu zápis prvního dotazu LINQ.

Spuštění dotazu

  1. Přidejte následující For Each smyčku pod dotaz v projektu.

    For Each studentRecord In studentQuery
        Console.WriteLine(studentRecord.Last & ", " & studentRecord.First)
    Next
    
  2. Umístěte ukazatel myši na proměnnou ovládacího prvku smyčky, studentRecord aby se zobrazil jeho datový typ. Typ studentRecord je odvozený Student , protože studentQuery vrací kolekci Student instancí.

  3. Sestavte a spusťte aplikaci stisknutím kombinace kláves CTRL + F5. Všimněte si výsledků v okně konzoly.

Úprava dotazu

Vyhledávání výsledků dotazu je snazší, pokud jsou v zadaném pořadí. Vrácenou sekvenci můžete seřadit na základě libovolného dostupného pole.

Řazení výsledků

  1. Přidejte následující Order By klauzuli mezi Where příkaz a Select příkaz dotazu. Order ByKlauzule seřadí výsledky abecedně od a do Z v závislosti na posledním jménu každého studenta.

    Order By currentStudent.Last Ascending
    
  2. Chcete-li seřadit podle příjmení a pak jako křestní jméno, přidejte do dotazu obě pole:

    Order By currentStudent.Last Ascending, currentStudent.First Ascending
    

    Můžete také určit Descending , že se má seřadit Z z do a.

  3. Sestavte a spusťte aplikaci stisknutím kombinace kláves CTRL + F5. Všimněte si výsledků v okně konzoly.

Zavedení lokálního identifikátoru

  1. Přidejte kód v této části, chcete-li do výrazu dotazu zavést místní identifikátor. Místní identifikátor bude obsahovat mezilehlé výsledky. V následujícím příkladu name je identifikátor, který obsahuje zřetězení křestní jméno a příjmení studenta. Místní identifikátor lze použít pro pohodlí nebo může zvýšit výkon tím, že ukládá výsledky výrazu, který by jinak vypočítal vícekrát.

    Dim studentQuery2 =
            From currentStudent In students
            Let name = currentStudent.Last & ", " & currentStudent.First
            Where currentStudent.Year = "Senior" And currentStudent.Rank <= 10
            Order By name Ascending
            Select currentStudent
    
    ' If you see too many results, comment out the previous
    ' For Each loop.
    For Each studentRecord In studentQuery2
        Console.WriteLine(studentRecord.Last & ", " & studentRecord.First)
    Next
    
  2. Sestavte a spusťte aplikaci stisknutím kombinace kláves CTRL + F5. Všimněte si výsledků v okně konzoly.

Projekce jednoho pole v klauzuli Select

  1. Přidejte dotaz a For Each smyčku z této části, chcete-li vytvořit dotaz, který vytvoří sekvenci, jejíž prvky se liší od prvků ve zdroji. V následujícím příkladu je zdrojem kolekce Student objektů, ale je vrácen pouze jeden člen každého objektu: křestní jméno studentů, jejichž příjmení je Garcia. Vzhledem k tomu currentStudent.First , že je řetězec, datový typ sekvence, kterou studentQuery3 vrátí IEnumerable(Of String) , je sekvence řetězců. Jak je uvedeno v předchozích příkladech, přiřazení datového typu pro studentQuery3 je ponecháno pro kompilátor pro určení pomocí odvození místního typu.

    Dim studentQuery3 = From currentStudent In students
                        Where currentStudent.Last = "Garcia"
                        Select currentStudent.First
    
    ' If you see too many results, comment out the previous
    ' For Each loops.
    For Each studentRecord In studentQuery3
        Console.WriteLine(studentRecord)
    Next
    
  2. Umístěte ukazatel myši nad studentQuery3 v kódu a ověřte, zda je přiřazený typ IEnumerable(Of String) .

  3. Sestavte a spusťte aplikaci stisknutím kombinace kláves CTRL + F5. Všimněte si výsledků v okně konzoly.

Vytvoření anonymního typu v klauzuli Select

  1. Přidejte kód z této části, abyste viděli, jak se v dotazech používají anonymní typy. Je možné je použít v dotazech, pokud chcete vrátit několik polí ze zdroje dat namísto úplných záznamů ( currentStudent záznamy v předchozích příkladech) nebo v jednom poli ( First v předchozí části). Namísto definování nového pojmenovaného typu, který obsahuje pole, která chcete zahrnout do výsledku, zadáte pole v Select klauzuli a kompilátor vytvoří anonymní typ s těmito poli jako jeho vlastnosti. Další informace najdete v tématu anonymní typy.

    Následující příklad vytvoří dotaz, který vrátí název a pořadí vyšších, jejichž školní řazení je v pořadí podle akademického řádu v rozmezí od 1 do 10. V tomto příkladu studentQuery4 musí být typ odvozen, protože Select klauzule vrací instanci anonymního typu a anonymní typ nemá použitelný název.

    Dim studentQuery4 =
            From currentStudent In students
            Where currentStudent.Year = "Senior" And currentStudent.Rank <= 10
            Order By currentStudent.Rank Ascending
            Select currentStudent.First, currentStudent.Last, currentStudent.Rank
    
    ' If you see too many results, comment out the previous
    ' For Each loops.
    For Each studentRecord In studentQuery4
        Console.WriteLine(studentRecord.Last & ", " & studentRecord.First &
                          ":  " & studentRecord.Rank)
    Next
    
  2. Sestavte a spusťte aplikaci stisknutím kombinace kláves CTRL + F5. Všimněte si výsledků v okně konzoly.

Další příklady

Teď, když rozumíte základům, následuje seznam dalších příkladů, které ilustrují flexibilitu a sílu dotazů LINQ. Každý příklad předchází stručný popis toho, co dělá. Umístěte ukazatel myši na výslednou proměnnou dotazu pro každý dotaz, aby se zobrazil odvozený typ. For EachK vytvoření výsledků použijte smyčku.

' Find all students who are seniors.
Dim q1 = From currentStudent In students
         Where currentStudent.Year = "Senior"
         Select currentStudent

' Write a For Each loop to execute the query.
For Each q In q1
    Console.WriteLine(q.First & " " & q.Last)
Next

' Find all students with a first name beginning with "C".
Dim q2 = From currentStudent In students
         Where currentStudent.First.StartsWith("C")
         Select currentStudent

' Find all top ranked seniors (rank < 40).
Dim q3 = From currentStudent In students
         Where currentStudent.Rank < 40 And currentStudent.Year = "Senior"
         Select currentStudent

' Find all seniors with a lower rank than a student who 
' is not a senior.
Dim q4 = From student1 In students, student2 In students
         Where student1.Year = "Senior" And student2.Year <> "Senior" And
               student1.Rank > student2.Rank
         Select student1
         Distinct

' Retrieve the full names of all students, sorted by last name.
Dim q5 = From currentStudent In students
         Order By currentStudent.Last
         Select Name = currentStudent.First & " " & currentStudent.Last

' Determine how many students are ranked in the top 20.
Dim q6 = Aggregate currentStudent In students
         Where currentStudent.Rank <= 20
         Into Count()

' Count the number of different last names in the group of students.
Dim q7 = Aggregate currentStudent In students
         Select currentStudent.Last
         Distinct
         Into Count()

' Create a list box to show the last names of students.
Dim lb As New System.Windows.Forms.ListBox
Dim q8 = From currentStudent In students
         Order By currentStudent.Last
         Select currentStudent.Last Distinct

For Each nextName As String In q8
    lb.Items.Add(nextName)
Next

' Find every process that has a lowercase "h", "l", or "d" in its name.
Dim letters() As String = {"h", "l", "d"}
Dim q9 = From proc In System.Diagnostics.Process.GetProcesses,
         letter In letters
         Where proc.ProcessName.Contains(letter)
         Select proc

For Each proc In q9
    Console.WriteLine(proc.ProcessName & ", " & proc.WorkingSet64)
Next

Další informace

Jakmile se seznámíte se základními koncepty práce s dotazy, jste připraveni si přečíst dokumentaci a ukázky pro konkrétního typu poskytovatele LINQ, o který vás zajímá:

Viz také