Basisquerybewerkingen (Visual Basic)
Dit onderwerp bevat een korte inleiding tot LINQ-expressies (Language-Integrated Query) in Visual Basic en enkele van de typische soorten bewerkingen die u in een query uitvoert. Zie de volgende onderwerpen voor meer informatie:
Inleiding tot LINQ in Visual Basic
Overzicht: Query's schrijven in Visual Basic
De gegevensbron opgeven (van)
In een LINQ-query moet u eerst de gegevensbron opgeven die u wilt opvragen. Daarom komt de From
component in een query altijd als eerste. Queryoperators selecteren en vormgeven het resultaat op basis van het type bron.
Dim query = From cust In customers
' ...
De From
component geeft de gegevensbron en customers
een bereikvariabele op. cust
De bereikvariabele lijkt op een lusiteratievariabele, behalve dat er in een query-expressie geen werkelijke iteratie plaatsvindt. Wanneer de query wordt uitgevoerd, vaak met behulp van een For Each
lus, dient de bereikvariabele als verwijzing naar elk opeenvolgend element in customers
. Omdat de compiler het type cust
kan afleiden, hoeft u deze niet expliciet op te geven. Zie Typerelaties in Query Operations (Visual Basic) voor voorbeelden van query's die met en zonder expliciet typen zijn geschreven.
Zie From-component voor meer informatie over het gebruik van de From
component in Visual Basic.
Gegevens filteren (waar)
Waarschijnlijk is de meest voorkomende querybewerking het toepassen van een filter in de vorm van een Boole-expressie. De query retourneert vervolgens alleen de elementen waarvoor de expressie waar is. Er wordt een Where
component gebruikt om het filteren uit te voeren. Het filter geeft aan welke elementen in de gegevensbron moeten worden opgenomen in de resulterende reeks. In het volgende voorbeeld worden alleen klanten opgenomen die een adres in Londen hebben.
Dim londonCusts = From cust In customers
Where cust.City = "London"
' ...
U kunt logische operatoren gebruiken, zoals And
en Or
om filterexpressies in een Where
component te combineren. Als u bijvoorbeeld alleen klanten wilt retourneren die afkomstig zijn uit Londen en waarvan de naam Devon is, gebruikt u de volgende code:
Where cust.City = "London" And cust.Name = "Devon"
Als u klanten wilt retourneren uit Londen of Parijs, gebruikt u de volgende code:
Where cust.City = "London" Or cust.City = "Paris"
Zie Where-component voor meer informatie over het gebruik van de Where
component in Visual Basic.
Gegevens bestellen (bestellen op)
Het is vaak handig om geretourneerde gegevens in een bepaalde volgorde te sorteren. De Order By
component zorgt ervoor dat de elementen in de geretourneerde reeks worden gesorteerd op een opgegeven veld of velden. Met de volgende query worden de resultaten bijvoorbeeld gesorteerd op basis van de Name
eigenschap. Omdat Name
dit een tekenreeks is, worden de geretourneerde gegevens alfabetisch gesorteerd, van A naar Z.
Dim londonCusts1 = From cust In customers
Where cust.City = "London"
Order By cust.Name Ascending
' ...
Als u de resultaten in omgekeerde volgorde wilt rangschikken, gebruikt u de Order By...Descending
component van Z naar A. De standaardwaarde is Ascending
wanneer noch Ascending
noch Descending
is opgegeven.
Zie Order By-component voor meer informatie over het gebruik van de Order By
component in Visual Basic.
Gegevens selecteren (selecteren)
De Select
component geeft het formulier en de inhoud van geretourneerde elementen op. U kunt bijvoorbeeld opgeven of uw resultaten bestaan uit volledige Customer
objecten, slechts één Customer
eigenschap, een subset eigenschappen, een combinatie van eigenschappen uit verschillende gegevensbronnen of een nieuw resultaattype op basis van een berekening. Wanneer de Select
component iets anders produceert dan een kopie van het bronelement, wordt de bewerking een projectie genoemd.
Als u een verzameling wilt ophalen die uit volledige Customer
objecten bestaat, selecteert u de bereikvariabele zelf:
Dim londonCusts2 = From cust In customers
Where cust.City = "London"
Order By cust.Name Ascending
Select cust
Als een Customer
exemplaar een groot object is dat veel velden bevat en alles wat u wilt ophalen de naam is, kunt cust.Name
u selecteren, zoals wordt weergegeven in het volgende voorbeeld. Lokale typedeductie herkent dat dit het resultaattype wijzigt van een verzameling objecten in een verzameling Customer
tekenreeksen.
Dim londonCusts3 = From cust In customers
Where cust.City = "London"
Order By cust.Name Ascending
Select cust.Name
Als u meerdere velden in de gegevensbron wilt selecteren, hebt u twee opties:
Geef in de
Select
component de velden op die u wilt opnemen in het resultaat. De compiler definieert een anoniem type met deze velden als eigenschappen. Zie Anonieme typen voor meer informatie.Omdat de geretourneerde elementen in het volgende voorbeeld exemplaren van een anoniem type zijn, kunt u niet verwijzen naar het type op naam elders in uw code. De door de compiler aangewezen naam voor het type bevat tekens die niet geldig zijn in normale Visual Basic-code. In het volgende voorbeeld zijn de elementen in de verzameling die door de query
londonCusts4
worden geretourneerd, exemplaren van een anoniem typeDim londonCusts4 = From cust In customers Where cust.City = "London" Order By cust.Name Ascending Select Name = cust.Name, Phone = cust.Phone For Each londonCust In londonCusts4 Console.WriteLine(londonCust.Name & " " & londonCust.Phone) Next
– of –
Definieer een benoemd type dat de specifieke velden bevat die u wilt opnemen in het resultaat en maak en initialiseer exemplaren van het type in de
Select
component. Gebruik deze optie alleen als u afzonderlijke resultaten buiten de verzameling waarin ze worden geretourneerd, moet gebruiken of als u ze moet doorgeven als parameters in methode-aanroepen. Het type inlondonCusts5
het volgende voorbeeld is IEnumerable(Of Name Telefoon).Public Class NamePhone Public Name As String Public Phone As String ' Additional class elements End Class
Dim londonCusts5 = From cust In customers Where cust.City = "London" Order By cust.Name Ascending Select New NamePhone With {.Name = cust.Name, .Phone = cust.Phone}
Zie Select Clause voor meer informatie over het gebruik van de Select
component in Visual Basic.
Deelnemen aan gegevens (deelnemen aan groepen en deelnemen aan groepen)
U kunt meer dan één gegevensbron op verschillende manieren combineren in de From
component. De volgende code maakt bijvoorbeeld gebruik van twee gegevensbronnen en combineert impliciet eigenschappen uit beide gegevensbronnen in het resultaat. De query selecteert leerlingen/studenten waarvan de achternamen beginnen met een klinker.
Dim vowels() As String = {"A", "E", "I", "O", "U"}
Dim vowelNames = From student In students, vowel In vowels
Where student.Last.IndexOf(vowel) = 0
Select Name = student.First & " " &
student.Last, Initial = vowel
Order By Initial
For Each vName In vowelNames
Console.WriteLine(vName.Initial & ": " & vName.Name)
Next
Notitie
U kunt deze code uitvoeren met de lijst met leerlingen/studenten die zijn gemaakt in Procedure: Een lijst met items maken.
Het Join
trefwoord is gelijk aan een INNER JOIN
in SQL. Er worden twee verzamelingen gecombineerd op basis van overeenkomende sleutelwaarden tussen elementen in de twee verzamelingen. De query retourneert alle of een deel van de verzamelingselementen met overeenkomende sleutelwaarden. Met de volgende code wordt bijvoorbeeld de actie van de vorige impliciete join gedupliceerd.
Dim vowelNames2 = From student In students
Join vowel In vowels
On student.Last(0) Equals vowel
Select Name = student.First & " " &
student.Last, Initial = vowel
Order By Initial
Group Join
combineert verzamelingen in één hiërarchische verzameling, net als een LEFT JOIN
in SQL. Zie Join-component en Group Join Clause voor meer informatie.
Gegevens groeperen (groeperen op)
U kunt een Group By
component toevoegen om de elementen in een queryresultaat te groeperen op basis van een of meer velden van de elementen. De volgende code groeperen bijvoorbeeld leerlingen/studenten per klasjaar.
Dim studentsByYear = From student In students
Select student
Group By year = student.Year
Into Classes = Group
For Each yearGroup In studentsByYear
Console.WriteLine(vbCrLf & "Year: " & yearGroup.year)
For Each student In yearGroup.Classes
Console.WriteLine(" " & student.Last & ", " & student.First)
Next
Next
Als u deze code uitvoert met behulp van de lijst met leerlingen/studenten die zijn gemaakt in Procedure: Een lijst met items maken, is de uitvoer van de For Each
instructie:
Jaar: Junior
Tucker, Michael
Garcia, Hugo
Garcia, Debra
Tucker, Lance
Jaar: Senior
Omelchenko, Svetlana
Osada, Michiko
Fakhouri, Fadi
Feng, Hanying
Adams, Terry
Jaar: Eerstejaars
Mortensen, Sven
Garcia, Caesar
Met de variatie die in de volgende code wordt weergegeven, worden de klasjaren gesorteerd en worden de studenten binnen elk jaar op achternaam gerangschikt.
Dim studentsByYear2 = From student In students
Select student
Order By student.Year, student.Last
Group By year = student.Year
Into Classes = Group
Zie Group By-component voor meer informatie.Group By