Dela via


Visual Basic-funktioner som stöder LINQ

Namnet Language-Integrated Query (LINQ) refererar till teknik i Visual Basic som stöder frågesyntax och andra språkkonstruktioner direkt på språket. Med LINQ behöver du inte lära dig ett nytt språk för att köra frågor mot en extern datakälla. Du kan köra frågor mot data i relationsdatabaser, XML-lager eller objekt med hjälp av Visual Basic. Den här integreringen av frågefunktioner i språket möjliggör kompileringstidskontroll för syntaxfel och typsäkerhet. Den här integreringen säkerställer också att du redan vet det mesta av det du behöver veta för att skriva omfattande, varierande frågor i Visual Basic.

I följande avsnitt beskrivs språkkonstruktionerna som stöder LINQ tillräckligt detaljerat så att du kan komma igång med att läsa introduktionsdokumentationen, kodexempel och exempelprogram. Du kan också klicka på länkarna för att hitta mer detaljerade förklaringar av hur språkfunktionerna samlas för att aktivera språkintegrerad fråga. Ett bra ställe att börja på är Genomgång: Skriva frågor i Visual Basic.

Frågeuttryck

Frågeuttryck i Visual Basic kan uttryckas i en deklarativ syntax som liknar SQL eller XQuery. Vid kompileringen konverteras frågesyntaxen till metodanrop till en LINQ-providers implementering av standardmetoderna för frågeoperatortillägg. Program styr vilka standardfrågeoperatorer som finns i omfånget genom att ange lämpligt namnområde med en Imports -instruktion. Syntaxen för ett Visual Basic-frågeuttryck ser ut så här:

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

Mer information finns i Introduktion till LINQ i Visual Basic.

Implicit inskrivna variabler

I stället för att uttryckligen ange en typ när du deklarerar och initierar en variabel kan du aktivera kompilatorn för att härleda och tilldela typen. Detta kallas för lokal typinferens.

Variabler vars typer härleds skrivs starkt, precis som variabler vars typ du uttryckligen anger. Slutsatsdragning av lokal typ fungerar bara när du definierar en lokal variabel i en metodtext. Mer information finns i Inferens för alternativinferens och slutsatsdragning av lokal typ.

I följande exempel visas slutsatsdragning av lokal typ. Om du vill använda det här exemplet måste du ange Option Infer till On.

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

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

Slutsatsdragning av lokal typ gör det också möjligt att skapa anonyma typer, som beskrivs senare i det här avsnittet och är nödvändiga för LINQ-frågor.

I följande LINQ-exempel inträffar typinferens om Option Infer är antingen On eller Off. Ett kompileringsfel inträffar om Option Infer är Off och Option Strict är On.

' 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

Objektinitierare

Objektinitierare används i frågeuttryck när du måste skapa en anonym typ för att lagra resultatet av en fråga. De kan också användas för att initiera objekt av namngivna typer utanför frågor. Genom att använda en objektinitierare kan du initiera ett objekt på en enda rad utan att uttryckligen anropa en konstruktor. Förutsatt att du har en klass med namnet Customer som har offentliga Name egenskaper och Phone egenskaper, tillsammans med andra egenskaper, kan en objektinitierare användas på följande sätt:

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

Mer information finns i Objektinitierare: Namngivna och anonyma typer.

Anonyma typer

Anonyma typer är ett bekvämt sätt att tillfälligt gruppera en uppsättning egenskaper i ett element som du vill inkludera i ett frågeresultat. På så sätt kan du välja valfri kombination av tillgängliga fält i frågan, i valfri ordning, utan att definiera en namngiven datatyp för elementet.

En anonym typ skapas dynamiskt av kompilatorn. Namnet på typen tilldelas av kompilatorn och kan ändras med varje ny kompilering. Därför kan namnet inte användas direkt. Anonyma typer initieras på följande sätt:

' 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

Mer information finns i Anonyma typer.

Tilläggsmetoder

Med tilläggsmetoder kan du lägga till metoder i en datatyp eller ett gränssnitt utanför definitionen. Med den här funktionen kan du i praktiken lägga till nya metoder i en befintlig typ utan att ändra typen. Vanliga frågeoperatorer är själva en uppsättning tilläggsmetoder som tillhandahåller LINQ-frågefunktioner för alla typer som implementerar IEnumerable<T>. Andra tillägg som inkluderar IEnumerable<T>Count, Unionoch Intersect.

Följande tilläggsmetod lägger till en utskriftsmetod i String klassen.

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

Metoden kallas som en vanlig instansmetod för String:

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

Mer information finns i Tilläggsmetoder.

Lambda-uttryck

Ett lambda-uttryck är en funktion utan ett namn som beräknar och returnerar ett enda värde. Till skillnad från namngivna funktioner kan ett lambda-uttryck definieras och köras samtidigt. I följande exempel visas 4.

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

Du kan tilldela lambda-uttrycksdefinitionen till ett variabelnamn och sedan använda namnet för att anropa funktionen. I följande exempel visas också 4.

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

I LINQ ligger lambda-uttryck bakom många av standardfrågeoperatorerna. Kompilatorn skapar lambda-uttryck för att samla in de beräkningar som definieras i grundläggande frågemetoder som Where, Select, Order By, Take Whileoch andra.

Följande kod definierar till exempel en fråga som returnerar alla seniora studenter från en lista över studenter.

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

Frågedefinitionen kompileras till kod som liknar följande exempel, som använder två lambda-uttryck för att ange argumenten för Where och Select.

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

Båda versionerna kan köras med hjälp av en For Each loop:

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

Mer information finns i Lambda-uttryck.

Se även