Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Tato praktická příručka ukazuje, jak pomocí funkcí jazyka Visual Basic psát výrazy dotazu Language-Integrated Query (LINQ). 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 Nový a potom klikněte naProjekt .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. Také seznam Importovaných oborů názvů na stránce Odkazy, Návrhář projektu (Visual Basic) obsahuje System.Linq obor názvů.
Na stránce Kompilace, Návrhář projektu (Visual Basic) se ujistěte, že je Option Infer nastaveno na Zapnuto.
Přidat zdroj dat In-Memory
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í, ročník a akademické pořadí v rámci studentského sboru.
Přidání zdroje dat
StudentDefinujte třídu a vytvořte seznam instancí třídy.Důležité
Kód potřebný k definování
Studenttří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
getStudentsmetodě přidejte do seznamu další instanciStudenttří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á 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
Najděte místo v
Mainmetodě 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 currentStudentUmístěte ukazatel myši na
studentQueryve vašem kódu, abyste ověřili, že typ přiřazený kompilátorem jeIEnumerable(Of Student).
Spusťte dotaz
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ý pomocí proměnné cyklu. Další informace o provádění dotazů naleznete v tématu Zápis prvního dotazu LINQ.
Pro spuštění dotazu
Pod dotaz v projektu přidejte následující
For Eachsmyčku.For Each studentRecord In studentQuery Console.WriteLine(studentRecord.Last & ", " & studentRecord.First) NextUmístěte ukazatel myši na řídicí proměnnou
studentRecordsmyčky a zobrazte jeho datový typ. TypstudentRecordje odvozen býtStudent, 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
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.
Seřazení výsledků
Přidejte následující
Order Byklauzuli meziWherepříkaz aSelectpříkaz dotazu. PodmínkaOrder Bybude seřazovat výsledky abecedně od A do Z podle příjmení každého studenta.Order By currentStudent.Last AscendingPokud chcete seřadit podle příjmení a potom podle křestního jména, přidejte do dotazu obě pole.
Order By currentStudent.Last Ascending, currentStudent.First AscendingMůžete také zadat
Descendingpoř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í místní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) NextSestavte a spusťte aplikaci stisknutím kombinace kláves CTRL+F5. Všimněte si výsledků v okně konzoly.
Projektovat jedno pole v klauzuli Select
Přidejte dotaz a
For Eachsmyč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 kolekceStudentobjektů, ale vrátí se pouze jeden člen každého objektu: křestní jméno studentů, jejichž příjmení je Garcia. Vzhledem k tomu, žecurrentStudent.Firstje řetězec, datový typ sekvence vrácené pomocístudentQuery3jeIEnumerable(Of String), posloupnost řetězců. Stejně jako v předchozích příkladech je přiřazení datového typustudentQuery3ponechá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) NextUmístěte ukazatel myši na
studentQuery3, abyste ověřili, že přiřazený typ jeIEnumerable(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. Použijete je v dotazech, když chcete vrátit několik polí ze zdroje dat, nikoli úplné záznamy (
currentStudentzáznamy v předchozích příkladech) nebo jednotlivá pole (Firstv předchozí části). Mí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 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ž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
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í: