Share via


Visual Basic-functies die LINQ ondersteunen

De naam Language-Integrated Query (LINQ) verwijst naar technologie in Visual Basic die ondersteuning biedt voor querysyntaxis en andere taalconstructies rechtstreeks in de taal. Met LINQ hoeft u geen nieuwe taal te leren om een query uit te voeren op een externe gegevensbron. U kunt query's uitvoeren op gegevens in relationele databases, XML-archieven of objecten met behulp van Visual Basic. Deze integratie van querymogelijkheden in de taal maakt het mogelijk om compileertijd te controleren op syntaxisfouten en typeveiligheid. Deze integratie zorgt er ook voor dat u al weet wat u moet weten om rijke, gevarieerde query's te schrijven in Visual Basic.

In de volgende secties worden de taalconstructies beschreven die LINQ in voldoende detail ondersteunen, zodat u aan de slag kunt met het lezen van de inleidende documentatie, codevoorbeelden en voorbeeldtoepassingen. U kunt ook op de koppelingen klikken om gedetailleerdere uitleg te vinden over de manier waarop de taalfuncties worden gecombineerd om geïntegreerde query's in te schakelen. Een goede plek om te beginnen is Walkthrough: Query's schrijven in Visual Basic.

Query-expressies

Query-expressies in Visual Basic kunnen worden uitgedrukt in een declaratieve syntaxis die vergelijkbaar is met die van SQL of XQuery. Tijdens het compileren wordt de querysyntaxis geconverteerd naar methode-aanroepen naar de implementatie van de standaard-queryoperatorextensiemethoden van een LINQ-provider. Toepassingen bepalen welke standaardqueryoperators binnen het bereik vallen door de juiste naamruimte met een Imports instructie op te geven. De syntaxis voor een Visual Basic-query-expressie ziet er als volgt uit:

Dim londonCusts = From cust In customers
                  Where cust.City = "London"
                  Order By cust.Name Ascending
                  Select cust.Name, cust.Phone

Zie Inleiding tot LINQ in Visual Basic voor meer informatie.

Impliciet getypte variabelen

In plaats van expliciet een type op te geven wanneer u een variabele declareert en initialiseert, kunt u inschakelen dat de compiler het type afwijst en toewijst. Dit wordt aangeduid als deductie van het lokale type.

Variabelen waarvan de typen worden afgeleid, worden sterk getypt, net zoals variabelen waarvan u het type expliciet opgeeft. Deductie van lokaal type werkt alleen wanneer u een lokale variabele in een hoofdtekst van een methode definieert. Zie Option Infer Statement en Local Type Inference voor meer informatie.

In het volgende voorbeeld ziet u deductie van het lokale type. Als u dit voorbeeld wilt gebruiken, moet u instellen op Option InferOn.

' The variable aNumber will be typed as an integer.
Dim aNumber = 5

' The variable aName will be typed as a String.
Dim aName = "Virginia"

Lokale typedeductie maakt het ook mogelijk om anonieme typen te maken, die verderop in deze sectie worden beschreven en die nodig zijn voor LINQ-query's.

Typ in het volgende LINQ-voorbeeld deductie als Option Infer dat het On geval is of Off. Er treedt een compilatietijdfout op als Option Infer dat het geval Off isOn.Option Strict

' Query example.
' If numbers is a one-dimensional array of integers, num will be typed
' as an integer and numQuery will be typed as IEnumerable(Of Integer)--
' basically a collection of integers.

Dim numQuery = From num In numbers
               Where num Mod 2 = 0
               Select num

Object-initialisatiefuncties

Object-initialisatiefuncties worden gebruikt in query-expressies wanneer u een anoniem type moet maken om de resultaten van een query te bewaren. Ze kunnen ook worden gebruikt om objecten van benoemde typen buiten query's te initialiseren. Met behulp van een object-initialisatiefunctie kunt u een object in één regel initialiseren zonder expliciet een constructor aan te roepen. Ervan uitgaande dat u een klasse hebt met Customer openbare Name en Phone eigenschappen, samen met andere eigenschappen, kan een object-initialisatiefunctie op deze manier worden gebruikt:

Dim aCust = New Customer With {.Name = "Mike",
                               .Phone = "555-0212"}

Zie Object initializers: Named and Anonymous Types voor meer informatie.

Anonieme typen

Anonieme typen bieden een handige manier om tijdelijk een set eigenschappen te groeperen in een element dat u wilt opnemen in een queryresultaat. Hiermee kunt u elke combinatie van beschikbare velden in de query kiezen, in elke volgorde, zonder een benoemd gegevenstype voor het element te definiëren.

Een anoniem type wordt dynamisch samengesteld door de compiler. De naam van het type wordt toegewezen door de compiler en kan worden gewijzigd bij elke nieuwe compilatie. Daarom kan de naam niet rechtstreeks worden gebruikt. Anonieme typen worden op de volgende manier geïnitialiseerd:

' Outside a query.
Dim product = New With {.Name = "paperclips", .Price = 1.29}

' Inside a query.
' You can use the existing member names of the selected fields, as was
' shown previously in the Query Expressions section of this topic.
Dim londonCusts1 = From cust In customers
                   Where cust.City = "London"
                   Select cust.Name, cust.Phone

' Or you can specify new names for the selected fields.
Dim londonCusts2 = From cust In customers
                   Where cust.City = "London"
                   Select CustomerName = cust.Name,
                   CustomerPhone = cust.Phone

Zie Anonieme typen voor meer informatie.

Extensiemethoden

Met extensiemethoden kunt u methoden toevoegen aan een gegevenstype of interface van buiten de definitie. Met deze functie kunt u in feite nieuwe methoden toevoegen aan een bestaand type zonder het type daadwerkelijk te wijzigen. De standaardqueryoperators zijn zelf een set extensiemethoden die LINQ-queryfunctionaliteit bieden voor elk type dat wordt geïmplementeerd IEnumerable<T>. Andere extensies die moeten IEnumerable<T> worden opgenomen Count, Unionen Intersect.

Met de volgende extensiemethode wordt een afdrukmethode aan de String klasse toegevoegd.

' Import System.Runtime.CompilerServices to use the Extension attribute.
<Extension()>
Public Sub Print(ByVal str As String)
    Console.WriteLine(str)
End Sub

De methode wordt aangeroepen als een gewone instantiemethode van String:

Dim greeting As String = "Hello"
greeting.Print()

Zie Extensiemethoden voor meer informatie.

Lambda-expressies

Een lambda-expressie is een functie zonder een naam die één waarde berekent en retourneert. In tegenstelling tot benoemde functies kan een lambda-expressie tegelijkertijd worden gedefinieerd en uitgevoerd. In het volgende voorbeeld ziet u 4.

Console.WriteLine((Function(num As Integer) num + 1)(3))

U kunt de lambda-expressiedefinitie toewijzen aan een variabelenaam en vervolgens de naam gebruiken om de functie aan te roepen. In het volgende voorbeeld wordt ook 4 weergegeven.

Dim add1 = Function(num As Integer) num + 1
Console.WriteLine(add1(3))

In LINQ zijn lambda-expressies een groot aantal van de standaardqueryoperators. De compiler maakt lambda-expressies om de berekeningen vast te leggen die zijn gedefinieerd in fundamentele querymethoden, zoals Where, SelectOrder By, en Take Whileandere.

Met de volgende code wordt bijvoorbeeld een query gedefinieerd waarmee alle senioren uit een lijst met leerlingen/studenten worden geretourneerd.

Dim seniorsQuery = From stdnt In students
                   Where stdnt.Year = "Senior"
                   Select stdnt

De querydefinitie wordt gecompileerd in code die vergelijkbaar is met het volgende voorbeeld, waarbij twee lambda-expressies worden gebruikt om de argumenten voor Where en Select.

Dim seniorsQuery2 = students.
    Where(Function(st) st.Year = "Senior").
    Select(Function(s) s)

Beide versies kunnen worden uitgevoerd met behulp van een For Each lus:

For Each senior In seniorsQuery
    Console.WriteLine(senior.Last & ", " & senior.First)
Next

Zie Lambda-expressies voor meer informatie.

Zie ook