Overzicht: Query's schrijven in Visual Basic
In dit scenario ziet u hoe u Visual Basic-taalfuncties kunt gebruiken om LINQ-queryexpressies (Language-Integrated Query) te schrijven. In het overzicht ziet u hoe u query's maakt in een lijst met studentobjecten, hoe u de query's uitvoert en hoe u deze kunt wijzigen. De query's bevatten verschillende functies, waaronder object-initialisatiefuncties, deductie van het lokale type en anonieme typen.
Nadat u deze procedure hebt voltooid, bent u klaar om verder te gaan met de voorbeelden en documentatie voor de specifieke LINQ-provider waarin u geïnteresseerd bent. LINQ-providers omvatten LINQ naar SQL, LINQ naar DataSet en LINQ naar XML.
Een project maken
Een consoletoepassingsproject maken
Start Visual Studio.
Wijs in het menu Bestand de optie Nieuw aan en klik op Project.
Klik in de lijst Geïnstalleerde sjablonen op Visual Basic.
Klik in de lijst met projecttypen op Consoletoepassing. Typ een naam voor het project in het vak Naam en klik op OK.
Er wordt een project gemaakt. Deze bevat standaard een verwijzing naar System.Core.dll. De lijst met geïmporteerde naamruimten op de referentiepagina bevat Project Designer (Visual Basic) ook de System.Linq naamruimte.
Controleerop de pagina Compileren of Project Designer (Visual Basic) is ingesteld op Aan.
Een in-memory gegevensbron toevoegen
De gegevensbron voor de query's in dit scenario is een lijst Student
met objecten. Elk Student
object bevat een voornaam, een achternaam, een klasjaar en een academische rang in de hoofdtekst van de student.
De gegevensbron toevoegen
Definieer een
Student
klasse en maak een lijst met exemplaren van de klasse.Belangrijk
De code die nodig is om de
Student
klasse te definiëren en de lijst te maken die wordt gebruikt in de overzichtsvoorbeelden, vindt u in Procedure: Een lijst met items maken. U kunt het van daaruit kopiëren en in uw project plakken. De nieuwe code vervangt de code die werd weergegeven toen u het project maakte.
Een nieuwe leerling/student toevoegen aan de lijst met leerlingen/studenten
- Volg het patroon in de
getStudents
methode om een ander exemplaar van deStudent
klasse toe te voegen aan de lijst. Als u de student toevoegt, maakt u kennis met object-initializers. Zie Object initializers: Named and Anonymous Types voor meer informatie.
Een query maken
Wanneer deze wordt uitgevoerd, produceert de query die in deze sectie is toegevoegd een lijst met de studenten waarvan de academische rang ze in de top tien plaatst. Omdat de query telkens het volledige Student
object selecteert, is IEnumerable(Of Student)
het type van het queryresultaat. Het type van de query wordt doorgaans echter niet opgegeven in querydefinities. In plaats daarvan gebruikt de compiler deductie van het lokale type om het type te bepalen. Zie Deductie van lokaal type voor meer informatie. De bereikvariabele van de query, currentStudent
fungeert als een verwijzing naar elk Student
exemplaar in de bron, students
waarmee toegang wordt geboden tot de eigenschappen van elk object in students
.
Een eenvoudige query maken
Zoek de plaats in de
Main
methode van het project die als volgt is gemarkeerd:' ****Paste query and query execution code from the walkthrough, ' ****or any code of your own, here in Main.
Kopieer de volgende code en plak deze in.
Dim studentQuery = From currentStudent In students Where currentStudent.Rank <= 10 Select currentStudent
Plaats de muis aanwijzer
studentQuery
in uw code om te controleren of het door de compiler toegewezen type isIEnumerable(Of Student)
.
De query uitvoeren
De variabele studentQuery
bevat de definitie van de query, niet de resultaten van het uitvoeren van de query. Een typisch mechanisme voor het uitvoeren van een query is een For Each
lus. Elk element in de geretourneerde reeks wordt geopend via de herhalingsvariabele van de lus. Zie Uw eerste LINQ-query schrijven voor meer informatie over het uitvoeren van query's.
De query uitvoeren
Voeg de volgende
For Each
lus toe onder de query in uw project.For Each studentRecord In studentQuery Console.WriteLine(studentRecord.Last & ", " & studentRecord.First) Next
Plaats de muiswijzer op de lusbesturingsvariabele
studentRecord
om het gegevenstype ervan te zien. Het typestudentRecord
wordt afgeleid,Student
omdatstudentQuery
een verzamelingStudent
exemplaren wordt geretourneerd.Bouw de toepassing en voer deze uit door op Ctrl+F5 te drukken. Noteer de resultaten in het consolevenster.
De query wijzigen
Het is eenvoudiger om queryresultaten te scannen als ze zich in een opgegeven volgorde bevinden. U kunt de geretourneerde volgorde sorteren op basis van elk beschikbaar veld.
De resultaten ordenen
Voeg de volgende
Order By
component toe tussen deWhere
instructie en deSelect
instructie van de query. DeOrder By
component rangschikt de resultaten alfabetisch van A tot Z, volgens de achternaam van elke student.Order By currentStudent.Last Ascending
Als u wilt orden op achternaam en vervolgens op voornaam, voegt u beide velden toe aan de query:
Order By currentStudent.Last Ascending, currentStudent.First Ascending
U kunt ook opgeven
Descending
om van Z naar A te bestellen.Bouw de toepassing en voer deze uit door op Ctrl+F5 te drukken. Noteer de resultaten in het consolevenster.
Een lokale id introduceren
Voeg de code in deze sectie toe om een lokale id in de query-expressie te introduceren. De lokale id bevat een tussenliggend resultaat. In het volgende voorbeeld
name
is een id die een samenvoeging van de voor- en achternamen van de leerling/student bevat. Een lokale id kan voor het gemak worden gebruikt of de prestaties verbeteren door de resultaten van een expressie op te slaan die anders meerdere keren zou worden berekend.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
Bouw de toepassing en voer deze uit door op Ctrl+F5 te drukken. Noteer de resultaten in het consolevenster.
Eén veld in de select-component projecteren
Voeg de query en
For Each
lus uit deze sectie toe om een query te maken die een reeks produceert waarvan de elementen verschillen van de elementen in de bron. In het volgende voorbeeld is de bron een verzamelingStudent
objecten, maar slechts één lid van elk object wordt geretourneerd: de voornaam van studenten waarvan de achternaam Garcia is. OmdatcurrentStudent.First
dit een tekenreeks is, isIEnumerable(Of String)
het gegevenstype van de reeks die wordtstudentQuery3
geretourneerd, een reeks tekenreeksen. Net als in eerdere voorbeelden wordt de toewijzing van een gegevenstypestudentQuery3
voor de compiler overgelaten om te bepalen met behulp van lokale typedeductie.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
Plaats de muis aanwijzer
studentQuery3
in uw code om te controleren of het toegewezen type isIEnumerable(Of String)
.Bouw de toepassing en voer deze uit door op Ctrl+F5 te drukken. Noteer de resultaten in het consolevenster.
Een anoniem type maken in de select-component
Voeg de code uit deze sectie toe om te zien hoe anonieme typen worden gebruikt in query's. U gebruikt deze in query's wanneer u meerdere velden uit de gegevensbron wilt retourneren in plaats van volledige records (
currentStudent
records in eerdere voorbeelden) of enkele velden (First
in de vorige sectie). In plaats van een nieuw benoemd type te definiëren dat de velden bevat die u wilt opnemen in het resultaat, geeft u de velden in deSelect
component op en maakt de compiler een anoniem type met deze velden als eigenschappen. Zie Anonieme typen voor meer informatie.In het volgende voorbeeld wordt een query gemaakt die de naam en rang van senioren retourneert waarvan de academische rang tussen 1 en 10 ligt, in volgorde van academische rang. In dit voorbeeld moet het type
studentQuery4
worden afgeleid omdat deSelect
component een exemplaar van een anoniem type retourneert en een anoniem type geen bruikbare naam heeft.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
Bouw de toepassing en voer deze uit door op Ctrl+F5 te drukken. Noteer de resultaten in het consolevenster.
Aanvullende voorbeelden
Nu u de basisbeginselen begrijpt, ziet u hieronder een lijst met aanvullende voorbeelden om de flexibiliteit en kracht van LINQ-query's te illustreren. Elk voorbeeld wordt voorafgegaan door een korte beschrijving van wat het doet. Plaats de muiswijzer op de queryresultaatvariabele voor elke query om het uitgestelde type weer te geven. Gebruik een For Each
lus om de resultaten te produceren.
' 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
Aanvullende informatie
Nadat u bekend bent met de basisconcepten van het werken met query's, kunt u de documentatie en voorbeelden lezen voor het specifieke type LINQ-provider waarin u geïnteresseerd bent: