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
Spusťte Visual Studio.
V nabídce soubor přejděte na příkaz Nový a poté klikněte na možnost Project.
V seznamu Nainstalované šablony klikněte na Visual Basic.
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ů.
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
Studenttřídu a vytvořte seznam instancí třídy.Důležité
Kód potřebný k definování
Studenttří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ů
- Postupujte podle vzoru v
getStudentsmetodě pro přidání další instanceStudenttřídy do seznamu. Přidáním studenta se seznámíte s Inicializátory objektů. Další informace naleznete v tématu Inicializátory objektů: pojmenované a anonymní typy.
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
Vyhledejte místo v
Mainmetodě 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 currentStudentUmístěte ukazatel myši nad
studentQueryv kódu a ověřte, zda je typ přiřazený kompilátoremIEnumerable(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
Přidejte následující
For Eachsmyčku pod dotaz v projektu.For Each studentRecord In studentQuery Console.WriteLine(studentRecord.Last & ", " & studentRecord.First) NextUmístěte ukazatel myši na proměnnou ovládacího prvku smyčky,
studentRecordaby se zobrazil jeho datový typ. TypstudentRecordje odvozenýStudent, protožestudentQueryvrací kolekciStudentinstancí.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ů
Přidejte následující
Order Byklauzuli meziWherepříkaz aSelectpří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 AscendingChcete-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 AscendingMůžete také určit
Descending, že se má seřadit Z 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, 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
nameje 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) NextSestavte 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 Eachsmyč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 kolekceStudentobjektů, ale je vrácen 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, kteroustudentQuery3vrátíIEnumerable(Of String), je sekvence řetězců. Jak je uvedeno v předchozích příkladech, přiřazení datového typu prostudentQuery3je 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) NextUmístěte ukazatel myši nad
studentQuery3v kódu a ověřte, zda je přiřazený typIEnumerable(Of String).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. Je možné je použít v dotazech, pokud chcete vrátit několik polí ze zdroje dat namísto úplných záznamů (
currentStudentzáznamy v předchozích příkladech) nebo v jednom poli (Firstv předchozí části). Namísto definování nového pojmenovaného typu, který obsahuje pole, která chcete zahrnout do výsledku, zadáte pole vSelectklauzuli 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
studentQuery4musí být typ odvozen, protožeSelectklauzule 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) NextSestavte 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á: