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
Spusťte Visual Studio.
V nabídce Soubor přejděte na příkaz Nový a klepněte na tlačítko Projekt.
V seznamu Nainstalované šablony klepněte na položku Visual Basic.
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ů.
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ů
- Podle vzoru v
getStudents
metodě přidejte do seznamu další instanciStudent
třídy. Přidání studenta vás seznámí s inicializátory objektů. Další informace naleznete v tématu Inicializátory objektů: pojmenované a anonymní typy.
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á currentStudent
rozsahu dotazu slouží jako odkaz na každou Student
instanci ve zdroji a students
poskytuje přístup k vlastnostem každého objektu v students
.
Vytvoření jednoduchého dotazu
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
Umístěte ukazatel myši na
studentQuery
kód, abyste ověřili, že jeIEnumerable(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
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
Umístěte ukazatel myši na řídicí proměnnou
studentRecord
smyčky a zobrazte jeho datový typ. TypstudentRecord
je odvozen býtStudent
, protožestudentQuery
vrací kolekciStudent
instancí.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ů
Přidejte následující
Order By
klauzuli meziWhere
příkaz aSelect
příkaz dotazu. KlauzuleOrder By
bude seřazené výsledky abecedně od A do Z podle příjmení každého studenta.Order By currentStudent.Last Ascending
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.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
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
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
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 kolekceStudent
objektů, ale vrátí se pouze jeden člen každého objektu: křestní jméno studentů, jejichž příjmení je Garcia. Vzhledem k tomucurrentStudent.First
, že je řetězec, datový typ sekvence vrácenéstudentQuery3
pomocí jeIEnumerable(Of String)
posloupnost řetězců. Stejně jako v předchozích příkladech je přiřazení datového typustudentQuery3
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
Umístěte ukazatel myši na
studentQuery3
kód a ověřte, že jeIEnumerable(Of String)
přiřazený typ .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
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 vSelect
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žeSelect
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
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í: