Delen via


Uw eerste LINQ-query schrijven (Visual Basic)

Een query is een expressie waarmee gegevens uit een gegevensbron worden opgehaald. Query's worden uitgedrukt in een toegewezen querytaal. In de loop van de tijd zijn verschillende talen ontwikkeld voor verschillende typen gegevensbronnen, bijvoorbeeld SQL voor relationele databases en XQuery voor XML. Hierdoor moet de ontwikkelaar van de toepassing een nieuwe querytaal leren voor elk type gegevensbron of gegevensindeling die wordt ondersteund.

Language-Integrated Query (LINQ) vereenvoudigt de situatie door een consis tentmodus l te bieden voor het werken met gegevens in verschillende soorten gegevensbronnen en indelingen. In een LINQ-query werkt u altijd met objecten. U gebruikt dezelfde basiscoderingspatronen voor het opvragen en transformeren van gegevens in XML-documenten, SQL-databases, ADO.NET gegevenssets en entiteiten, .NET Framework-verzamelingen en andere bronnen of indelingen waarvoor een LINQ-provider beschikbaar is. In dit document worden de drie fasen beschreven van het maken en gebruiken van eenvoudige LINQ-query's.

Drie fasen van een querybewerking

LINQ-querybewerkingen bestaan uit drie acties:

  1. Haal de gegevensbron of bronnen op.

  2. Maak de query.

  3. Voer de query uit.

In LINQ is de uitvoering van een query anders dan het maken van de query. U haalt geen gegevens op door alleen een query te maken. Dit punt wordt verderop in dit onderwerp nader besproken.

In het volgende voorbeeld ziet u de drie onderdelen van een querybewerking. In het voorbeeld wordt een matrix met gehele getallen gebruikt als een handige gegevensbron voor demonstratiedoeleinden. Dezelfde concepten zijn echter ook van toepassing op andere gegevensbronnen.

Notitie

Controleerop de pagina Compileren of Project Designer (Visual Basic) is ingesteld op Aan.

' Data source.
Dim numbers() As Integer = {0, 1, 2, 3, 4, 5, 6}

' Query creation.
Dim evensQuery = From num In numbers
                 Where num Mod 2 = 0
                 Select num

' Query execution.
For Each number In evensQuery
    Console.Write(number & " ")
Next

Uitvoer:

0 2 4 6

De gegevensbron

Omdat de gegevensbron in het vorige voorbeeld een matrix is, ondersteunt deze impliciet de algemene IEnumerable<T> interface. Dit is het feit dat u een matrix kunt gebruiken als gegevensbron voor een LINQ-query. Typen die ondersteuning bieden IEnumerable<T> voor of een afgeleide interface, zoals de algemeneIQueryable<T>, worden querybare typen genoemd.

Als impliciet doorzoekbaar type vereist de matrix geen wijziging of speciale behandeling om te fungeren als een LINQ-gegevensbron. Hetzelfde geldt voor elk verzamelingstype dat ondersteuning biedt IEnumerable<T>voor , inclusief de algemene List<T>, Dictionary<TKey,TValue>en andere klassen in de .NET Framework-klassebibliotheek.

Als de brongegevens nog niet worden geïmplementeerd IEnumerable<T>, is er een LINQ-provider nodig om de functionaliteit van de standaardqueryoperators voor die gegevensbron te implementeren. LINQ naar XML verwerkt bijvoorbeeld het werk van het laden van een XML-document in een querybaar XElement type, zoals wordt weergegeven in het volgende voorbeeld. Zie Overzicht van Standard-queryoperators (Visual Basic) voor meer informatie over standaardqueryoperators.

' Create a data source from an XML document.
Dim contacts = XElement.Load("c:\myContactList.xml")

Met LINQ naar SQL maakt u eerst een object-relationele toewijzing tijdens het ontwerp, handmatig of met behulp van de LINQ naar SQL Tools in Visual Studio in Visual Studio in Visual Studio. U schrijft uw query's op de objecten en tijdens runtime LINQ naar SQL wordt de communicatie met de database afgehandeld. In het volgende voorbeeld customers vertegenwoordigt u een specifieke tabel in de database en Table<TEntity> ondersteunt het algemene IQueryable<T>.

' Create a data source from a SQL table.
Dim db As New DataContext("C:\Northwind\Northwnd.mdf")
Dim customers As Table(Of Customer) = db.GetTable(Of Customer)

Zie de documentatie voor de verschillende LINQ-providers voor meer informatie over het maken van specifieke typen gegevensbronnen. (Zie voor een lijst met deze providers LINQ (Language-Integrated Query).) De basisregel is eenvoudig: een LINQ-gegevensbron is een object dat ondersteuning biedt voor de algemene IEnumerable<T> interface of een interface die ervan overkomt.

Notitie

Typen zoals ArrayList die ondersteuning bieden voor de niet-algemene IEnumerable interface kunnen ook worden gebruikt als LINQ-gegevensbronnen. Zie Een matrixlijst opvragen met LINQ (Visual Basic) voor een voorbeeld dat gebruikmaakt van een ArrayList.

De query

In de query geeft u op welke informatie u wilt ophalen uit de gegevensbron of bronnen. U kunt ook opgeven hoe deze gegevens moeten worden gesorteerd, gegroepeerd of gestructureerd voordat deze worden geretourneerd. Visual Basic heeft nieuwe querysyntaxis in de taal opgenomen om het maken van query's mogelijk te maken.

Wanneer deze wordt uitgevoerd, retourneert de query in het volgende voorbeeld alle even getallen uit een matrix met gehele getallen. numbers

' Data source.
Dim numbers() As Integer = {0, 1, 2, 3, 4, 5, 6}

' Query creation.
Dim evensQuery = From num In numbers
                 Where num Mod 2 = 0
                 Select num

' Query execution.
For Each number In evensQuery
    Console.Write(number & " ")
Next

De query-expressie bevat drie componenten: From, Whereen Select. De specifieke functie en het doel van elke component voor query-expressies wordt besproken in Basic Query Operations (Visual Basic). Zie Query's voor meer informatie. In LINQ wordt een querydefinitie vaak opgeslagen in een variabele en later uitgevoerd. De queryvariabele, zoals evensQuery in het vorige voorbeeld, moet een querybaar type zijn. Het type is IEnumerable(Of Integer), toegewezen door de compiler met behulp van evensQuery lokale typedeductie.

Het is belangrijk te onthouden dat de queryvariabele zelf geen actie onderneemt en geen gegevens retourneert. Alleen de querydefinitie wordt opgeslagen. In het vorige voorbeeld is het de For Each lus waarmee de query wordt uitgevoerd.

Queryuitvoering

De uitvoering van query's staat los van het maken van query's. Het maken van query's definieert de query, maar de uitvoering wordt geactiveerd door een ander mechanisme. Een query kan worden uitgevoerd zodra deze is gedefinieerd (onmiddellijke uitvoering) of de definitie kan worden opgeslagen en de query kan later worden uitgevoerd (uitgestelde uitvoering).

Uitgestelde uitvoering

Een typische LINQ-query lijkt op de query in het vorige voorbeeld, waarin evensQuery wordt gedefinieerd. De query wordt gemaakt, maar wordt niet onmiddellijk uitgevoerd. In plaats daarvan wordt de querydefinitie opgeslagen in de queryvariabele evensQuery. U voert de query later uit, meestal met behulp van een For Each lus, die een reeks waarden retourneert of door een standaardqueryoperator toe te passen, zoals Count of Max. Dit proces wordt de uitgestelde uitvoering genoemd.

' Query execution that results in a sequence of values.
For Each number In evensQuery
    Console.Write(number & " ")
Next

' Query execution that results in a single value.
Dim evens = evensQuery.Count()

Voor een reeks waarden opent u de opgehaalde gegevens met behulp van de iteratievariabele in de For Each lus (number in het vorige voorbeeld). Omdat de queryvariabele evensQuery, de querydefinitie bevat in plaats van de queryresultaten, kunt u een query zo vaak als u wilt uitvoeren met behulp van de queryvariabele meer dan één keer. U hebt bijvoorbeeld een database in uw toepassing die voortdurend wordt bijgewerkt door een afzonderlijke toepassing. Nadat u een query hebt gemaakt waarmee gegevens uit die database worden opgehaald, kunt u een For Each lus gebruiken om de query herhaaldelijk uit te voeren en de meest recente gegevens telkens op te halen.

In het volgende voorbeeld ziet u hoe de uitgestelde uitvoering werkt. Nadat evensQuery2 deze is gedefinieerd en uitgevoerd met een For Each lus, zoals in de vorige voorbeelden, worden sommige elementen in de gegevensbron numbers gewijzigd. Vervolgens wordt een tweede For Each lus opnieuw uitgevoerd evensQuery2 . De resultaten verschillen de tweede keer, omdat de For Each lus de query opnieuw uitvoert met behulp van de nieuwe waarden in numbers.

Dim numberArray() = {0, 1, 2, 3, 4, 5, 6}

Dim evensQuery2 = From num In numberArray
                  Where num Mod 2 = 0
                  Select num

Console.WriteLine("Evens in original array:")
For Each number In evensQuery2
    Console.Write("  " & number)
Next
Console.WriteLine()

' Change a few array elements.
numberArray(1) = 10
numberArray(4) = 22
numberArray(6) = 8

' Run the same query again.
Console.WriteLine(vbCrLf & "Evens in changed array:")
For Each number In evensQuery2
    Console.Write("  " & number)
Next
Console.WriteLine()

Uitvoer:

Evens in original array:

0 2 4 6

Evens in changed array:

0 10 2 22 8

Onmiddellijke uitvoering

Bij uitgestelde uitvoering van query's wordt de querydefinitie opgeslagen in een queryvariabele voor latere uitvoering. Bij onmiddellijke uitvoering wordt de query uitgevoerd op het moment van de definitie. De uitvoering wordt geactiveerd wanneer u een methode toepast waarvoor toegang tot afzonderlijke elementen van het queryresultaat is vereist. Onmiddellijke uitvoering wordt vaak gedwongen met behulp van een van de standaardqueryoperators die één waarden retourneren. Voorbeelden zijn Count, Max, Averageen First. Deze standaardqueryoperators voeren de query uit zodra ze worden toegepast om een singleton-resultaat te berekenen en te retourneren. Zie Aggregatiebewerkingen, Elementbewerkingen en Kwantificeerbewerkingen voor meer informatie over standaardqueryoperators die enkelvoudige waarden retourneren.

De volgende query retourneert een telling van de even getallen in een matrix met gehele getallen. De querydefinitie wordt niet opgeslagen en numEvens is een eenvoudige Integer.

Dim numEvens = (From num In numbers
                Where num Mod 2 = 0
                Select num).Count()

U kunt hetzelfde resultaat bereiken met behulp van de Aggregate methode.

Dim numEvensAgg = Aggregate num In numbers
                  Where num Mod 2 = 0
                  Select num
                  Into Count()

U kunt de uitvoering van een query ook afdwingen door de ToList of ToArray methode aan te roepen voor een query (direct) of queryvariabele (uitgesteld), zoals wordt weergegeven in de volgende code.

' Immediate execution.
Dim evensList = (From num In numbers
                 Where num Mod 2 = 0
                 Select num).ToList()

' Deferred execution.
Dim evensQuery3 = From num In numbers
                  Where num Mod 2 = 0
                  Select num
' . . .
Dim evensArray = evensQuery3.ToArray()

In de vorige voorbeelden evensQuery3 is dit een queryvariabele, maar evensList is een lijst en evensArray een matrix.

Het gebruik ToList of ToArray afdwingen van onmiddellijke uitvoering is vooral handig in scenario's waarin u de query onmiddellijk wilt uitvoeren en de resultaten in een enkel verzamelingsobject in de cache wilt opslaan. Zie Gegevenstypen converteren voor meer informatie over deze methoden.

U kunt er ook voor zorgen dat een query wordt uitgevoerd met behulp van een IEnumerable methode zoals de IEnumerable.GetEnumerator methode.

Zie ook