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

Tento názorný postup ukazuje, jak pomocí funkcí jazyka Visual Basic psát výrazy dotazu LINQ (Language-Integrated Query). Návod ukazuje, jak vytvářet dotazy na seznam objektů studenta, jak spouštět dotazy a jak je upravit. Dotazy zahrnují několik funkcí, včetně inicializátorů objektů, odvození místního typu a anonymních typů.

Po dokončení tohoto návodu budete připraveni přejít na ukázky a dokumentaci pro konkrétního poskytovatele LINQ, o který vás zajímá. Poskytovatelé LINQ zahrnují LINQ to SQL, LINQ to DataSet a LINQ to XML.

Vytvoření projektu

Vytvoření projektu konzolové aplikace

  1. Spusťte Visual Studio.

  2. V nabídce Soubor přejděte na příkaz Nový a klepněte na tlačítko Projekt.

  3. V seznamu Nainstalované šablony klepněte na položku Visual Basic.

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

    Vytvoří se projekt. Ve výchozím nastavení obsahuje odkaz na System.Core.dll. Seznam Importovaných oborů názvů na stránce Odkazy obsahuje také System.Linq návrhář projektu (Visual Basic) obor názvů.

  5. Na stránce kompilace návrhář projektu (Visual Basic) se ujistěte, že je odvozená možnost nastavena na Zapnuto.

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

Zdrojem dat pro dotazy v tomto názorném postupu je seznam Student objektů. Každý Student objekt obsahuje křestní jméno, příjmení, rok předmětu a akademické pořadí v těle studenta.

Přidání zdroje dat

  • Student Definujte 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 použitého v příkladech návodu je uveden v tématu Postupy: Vytvoření seznamu položek. Odtud ho můžete zkopírovat a vložit 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í vytvoří dotaz přidaný v této části seznam studentů, jejichž akademické pořadí je umístí do prvních deseti. Vzhledem k tomu, že dotaz vybere dokončený Student objekt pokaždé, je typ výsledku IEnumerable(Of Student)dotazu . Typ dotazu však obvykle není určen v definicích dotazu. Místo toho kompilátor k určení typu používá odvozování místního typu. Další informace naleznete v tématu Odvození místního typu. Proměnná currentStudentrozsahu dotazu slouží jako odkaz na každou Student instanci ve zdroji a studentsposkytuje přístup k vlastnostem každého objektu v students.

Vytvoření jednoduchého dotazu

  1. Najděte místo v Main metodě projektu, který je označen takto:

    ' ****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.

    Dim studentQuery = From currentStudent In students
                       Where currentStudent.Rank <= 10
                       Select currentStudent
    
  2. Umístěte ukazatel myši na studentQuery kód, abyste ověřili, že je IEnumerable(Of Student)typ přiřazený kompilátorem .

Spuštění dotazu

Proměnná studentQuery obsahuje definici dotazu, nikoli výsledky spuštění dotazu. Typickým mechanismem spuštění dotazu je smyčka For Each . Každý prvek ve vrácené sekvenci je přístupný 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. Pod dotaz v projektu přidejte následující For Each smyčku.

    For Each studentRecord In studentQuery
        Console.WriteLine(studentRecord.Last & ", " & studentRecord.First)
    Next
    
  2. Umístěte ukazatel myši na řídicí proměnnou studentRecord smyčky a zobrazte jeho datový typ. Typ studentRecord je odvozen být 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

Výsledky dotazu je snazší zkontrolovat, pokud jsou v zadaném pořadí. Vrácenou sekvenci můžete seřadit podle 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. Klauzule Order By bude seřazené výsledky abecedně od A do Z podle příjmení každého studenta.

    Order By currentStudent.Last Ascending
    
  2. Pokud chcete pořadí objednat podle příjmení a potom křestním jménem, přidejte do dotazu obě pole:

    Order By currentStudent.Last Ascending, currentStudent.First Ascending
    

    Můžete také zadat Descending pořadí od 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 pro zavedení místního identifikátoru ve výrazu dotazu. Místní identifikátor bude obsahovat průběžný výsledek. V následujícím příkladu je identifikátor, name který obsahuje zřetězení křestního jména a příjmení studenta. Místní identifikátor lze použít pro usnadnění nebo může zvýšit výkon uložením výsledků výrazu, který by jinak byl vypočítán 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 a vytvořte 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 vrátí se 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 vrácené studentQuery3 pomocí je IEnumerable(Of String)posloupnost řetězců. Stejně jako v předchozích příkladech je přiřazení datového typu studentQuery3 ponecháno pro kompilátor k určení pomocí odvozování 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 na studentQuery3 kód a ověřte, že je IEnumerable(Of String)přiřazený typ .

  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. Použijete je v dotazech, když chcete vrátit několik polí ze zdroje dat, nikoli úplné záznamy (currentStudent záznamy v předchozích příkladech) nebo jednotlivá pole (First v předchozí části). Mí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 naleznete v tématu Anonymní typy.

    Následující příklad vytvoří dotaz, který vrátí název a pořadí seniorů, jejichž akademické pořadí je v pořadí od 1 do 10. V tomto příkladu musí být odvozen typ studentQuery4 , 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

Když teď rozumíte základům, následuje seznam dalších příkladů, které ilustrují flexibilitu a výkon dotazů LINQ. Každému příkladu předchází stručný popis toho, co dělá. Umístěte ukazatel myši na proměnnou výsledku dotazu pro každý dotaz, aby se zobrazil odvozený typ. For Each K 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, můžete si přečíst dokumentaci a ukázky pro konkrétní typ poskytovatele LINQ, kterého vás zajímají:

Viz také