Dela via


Introduktion till LINQ i Visual Basic

Språkintegrerad fråga (LINQ) lägger till frågefunktioner i Visual Basic och ger enkla och kraftfulla funktioner när du arbetar med alla typer av data. I stället för att skicka en fråga till en databas som ska bearbetas eller arbeta med olika frågesyntaxer för varje typ av data som du söker i, introducerar LINQ frågor som en del av Visual Basic-språket. Den använder en enhetlig syntax oavsett typ av data.

MED LINQ kan du fråga efter data från en SQL Server-databas, XML, minnesinterna matriser och samlingar, ADO.NET datauppsättningar eller någon annan fjärransluten eller lokal datakälla som stöder LINQ. Du kan göra allt detta med vanliga Visual Basic-språkelement. Eftersom dina frågor är skrivna på visual basic-språket returneras dina frågeresultat som starkt skrivna objekt. Dessa objekt stöder IntelliSense, vilket gör att du kan skriva kod snabbare och fånga upp fel i dina frågor vid kompileringstid i stället för vid körning. LINQ-frågor kan användas som källa för ytterligare frågor för att förfina resultaten. De kan också bindas till kontroller så att användarna enkelt kan visa och ändra dina frågeresultat.

I följande kodexempel visas till exempel en LINQ-fråga som returnerar en lista över kunder från en samling och grupperar dem baserat på deras plats.

' Obtain a list of customers.
Dim customers As List(Of Customer) = GetCustomers()

' Return customers that are grouped based on country.
Dim countries = From cust In customers
                Order By cust.Country, cust.City
                Group By CountryName = cust.Country
                Into CustomersInCountry = Group, Count()
                Order By CountryName

' Output the results.
For Each country In countries
    Debug.WriteLine(country.CountryName & " count=" & country.Count)

    For Each customer In country.CustomersInCountry
        Debug.WriteLine("   " & customer.CompanyName & "  " & customer.City)
    Next
Next

' Output:
'   Canada count=2
'      Contoso, Ltd  Halifax
'      Fabrikam, Inc.  Vancouver
'   United States count=1
'      Margie's Travel  Redmond

Köra exemplen

Om du vill köra exemplen i introduktionen och i avsnittet Struktur för en LINQ-fråga inkluderar du följande kod, som returnerar listor över kunder och beställningar.

' Return a list of customers.
Private Function GetCustomers() As List(Of Customer)
    Return New List(Of Customer) From
        {
            New Customer With {.CustomerID = 1, .CompanyName = "Contoso, Ltd", .City = "Halifax", .Country = "Canada"},
            New Customer With {.CustomerID = 2, .CompanyName = "Margie's Travel", .City = "Redmond", .Country = "United States"},
            New Customer With {.CustomerID = 3, .CompanyName = "Fabrikam, Inc.", .City = "Vancouver", .Country = "Canada"}
        }
End Function

' Return a list of orders.
Private Function GetOrders() As List(Of Order)
    Return New List(Of Order) From
        {
            New Order With {.CustomerID = 1, .Amount = "200.00"},
            New Order With {.CustomerID = 3, .Amount = "600.00"},
            New Order With {.CustomerID = 1, .Amount = "300.00"},
            New Order With {.CustomerID = 2, .Amount = "100.00"},
            New Order With {.CustomerID = 3, .Amount = "800.00"}
        }
End Function

' Customer Class.
Private Class Customer
    Public Property CustomerID As Integer
    Public Property CompanyName As String
    Public Property City As String
    Public Property Country As String
End Class

' Order Class.
Private Class Order
    Public Property CustomerID As Integer
    Public Property Amount As Decimal
End Class

LINQ-leverantörer

En LINQ-provider mappar dina Visual Basic LINQ-frågor till datakällan som efterfrågas. När du skriver en LINQ-fråga tar providern den frågan och översätter den till kommandon som datakällan kan köra. Providern konverterar också data från källan till de objekt som utgör frågeresultatet. Slutligen konverteras objekt till data när du skickar uppdateringar till datakällan.

Visual Basic innehåller följande LINQ-providers.

Provider beskrivning
LINQ till objekt Med linq-till-objekt-providern kan du fråga minnesinterna samlingar och matriser. Om ett objekt stöder antingen IEnumerable eller-gränssnittet IEnumerable<T> kan du köra frågor mot linq-till-objekt-providern.

Du kan aktivera LINQ till objekt-providern genom att System.Linq importera namnområdet, som importeras som standard för alla Visual Basic-projekt.

Mer information om LINQ-till-objekt-providern finns i LINQ till objekt.
LINQ till SQL Med LINQ till SQL-providern kan du fråga och ändra data i en SQL Server-databas. Det gör det enkelt att mappa objektmodellen för ett program till tabellerna och objekten i en databas.

Visual Basic gör det enklare att arbeta med LINQ till SQL genom att inkludera Object Relational Designer (O/R Designer). Den här designern används för att skapa en objektmodell i ett program som mappar till objekt i en databas. O/R Designer innehåller också funktioner för att mappa lagrade procedurer och funktioner till DataContext objektet, som hanterar kommunikationen med databasen och lagrar tillstånd för optimistiska samtidighetskontroller.

Mer information om LINQ till SQL-providern finns i LINQ till SQL. Mer information om objektrelationsdesignern finns i LINQ till SQL Tools i Visual Studio.
LINQ till XML Med LINQ till XML-providern kan du fråga och ändra XML. Du kan ändra minnesintern XML eller läsa in XML från och spara XML i en fil.

Dessutom möjliggör LINQ till XML-providern XML-literaler och XML-axelegenskaper som gör att du kan skriva XML direkt i Visual Basic-koden. Mer information finns i XML.
LINQ till DataSet Med LINQ till DataSet-providern kan du fråga och uppdatera data i en ADO.NET datauppsättning. Du kan lägga till kraften i LINQ i program som använder datauppsättningar för att förenkla och utöka dina funktioner för att fråga, aggregera och uppdatera data i datauppsättningen.

Mer information finns i LINQ till DataSet.

Strukturen för en LINQ-fråga

En LINQ-fråga, som ofta kallas ett frågeuttryck, består av en kombination av frågesatser som identifierar datakällorna och iterationsvariablerna för frågan. Ett frågeuttryck kan också innehålla instruktioner för sortering, filtrering, gruppering och anslutning eller beräkningar som ska tillämpas på källdata. Frågeuttryckssyntaxen liknar syntaxen för SQL. Därför kan du hitta mycket av den välbekanta syntaxen.

Ett frågeuttryck börjar med en From sats. Den här satsen identifierar källdata för en fråga och de variabler som används för att referera till varje element i källdata individuellt. Dessa variabler heter intervallvariabler eller iterationsvariabler. Satsen From krävs för en fråga, förutom frågor Aggregate , där From satsen är valfri. När frågans omfång och källa har identifierats i satserna From eller Aggregate kan du inkludera valfri kombination av frågesatser för att förfina frågan. Mer information om frågesatser finns i Visual Basic LINQ-frågeoperatorer senare i det här avsnittet. Följande fråga identifierar till exempel en källsamling med kunddata som variabel och customers en iterationsvariabel med namnet cust.

Dim customers = GetCustomers()

Dim queryResults = From cust In customers

For Each result In queryResults
    Debug.WriteLine(result.CompanyName & "  " & result.Country)
Next

' Output:
'   Contoso, Ltd  Canada
'   Margie's Travel  United States
'   Fabrikam, Inc.  Canada

Det här exemplet är en giltig fråga av sig själv. Frågan blir dock mycket mer kraftfull när du lägger till fler frågesatser för att förfina resultatet. Du kan till exempel lägga till en Where sats för att filtrera resultatet med ett eller flera värden. Frågeuttryck är en enda kodrad. du kan bara lägga till ytterligare frågesatser i slutet av frågan. Du kan dela upp en fråga över flera textrader för att förbättra läsbarheten med hjälp av linjefortsättningstecknet understreck (_). I följande kodexempel visas ett exempel på en fråga som innehåller en Where -sats.

Dim queryResults = From cust In customers
                   Where cust.Country = "Canada"

En annan kraftfull frågesats är Select -satsen, som gör att du endast kan returnera valda fält från datakällan. LINQ-frågor returnerar uppräkningsbara samlingar med starkt skrivna objekt. En fråga kan returnera en samling anonyma typer eller namngivna typer. Du kan använda Select -satsen för att endast returnera ett enda fält från datakällan. När du gör detta är den typ av samling som returneras typen av det enskilda fältet. Du kan också använda Select -satsen för att returnera flera fält från datakällan. När du gör det är typen av samling som returneras en ny anonym typ. Du kan också matcha fälten som returneras av frågan med fälten för en angiven namngiven typ. I följande kodexempel visas ett frågeuttryck som returnerar en samling anonyma typer som har medlemmar ifyllda med data från de valda fälten från datakällan.

Dim queryResults = From cust In customers
               Where cust.Country = "Canada"
               Select cust.CompanyName, cust.Country

LINQ-frågor kan också användas för att kombinera flera datakällor och returnera ett enda resultat. Detta kan göras med en eller flera From satser, eller med hjälp Join av frågesatserna eller Group Join . I följande kodexempel visas ett frågeuttryck som kombinerar kund- och orderdata och returnerar en samling anonyma typer som innehåller kund- och orderdata.

Dim customers = GetCustomers()
Dim orders = GetOrders()

Dim queryResults = From cust In customers, ord In orders
           Where cust.CustomerID = ord.CustomerID
           Select cust, ord

For Each result In queryResults
    Debug.WriteLine(result.ord.Amount & "  " & result.ord.CustomerID & "  " & result.cust.CompanyName)
Next

' Output:
'   200.00  1  Contoso, Ltd
'   300.00  1  Contoso, Ltd
'   100.00  2  Margie's Travel
'   600.00  3  Fabrikam, Inc.
'   800.00  3  Fabrikam, Inc.

Du kan använda Group Join -satsen för att skapa ett hierarkiskt frågeresultat som innehåller en samling kundobjekt. Varje kundobjekt har en egenskap som innehåller en samling av alla beställningar för kunden. I följande kodexempel visas ett frågeuttryck som kombinerar kund- och orderdata som ett hierarkiskt resultat och returnerar en samling anonyma typer. Frågan returnerar en typ som innehåller en CustomerOrders egenskap som innehåller en samling orderdata för kunden. Den innehåller också en OrderTotal egenskap som innehåller summan av summorna för alla beställningar för kunden. (Den här frågan motsvarar en VÄNSTER YTTRE KOPPLING.)

Dim customers = GetCustomers()
Dim orders = GetOrders()

Dim queryResults = From cust In customers
                   Group Join ord In orders On
                     cust.CustomerID Equals ord.CustomerID
                     Into CustomerOrders = Group,
                          OrderTotal = Sum(ord.Amount)
                   Select cust.CompanyName, cust.CustomerID,
                          CustomerOrders, OrderTotal

For Each result In queryResults
    Debug.WriteLine(result.OrderTotal & "  " & result.CustomerID & "  " & result.CompanyName)
    For Each ordResult In result.CustomerOrders
        Debug.WriteLine("   " & ordResult.Amount)
    Next
Next

' Output:
'   500.00  1  Contoso, Ltd
'      200.00
'      300.00
'   100.00  2  Margie's Travel
'      100.00
'   1400.00  3  Fabrikam, Inc.
'      600.00
'      800.00

Det finns flera ytterligare LINQ-frågeoperatorer som du kan använda för att skapa kraftfulla frågeuttryck. I nästa avsnitt i det här avsnittet beskrivs de olika frågesatser som du kan inkludera i ett frågeuttryck. Mer information om Visual Basic-frågesatser finns i Frågor.

Linq-frågeoperatorer för Visual Basic

Klasserna i System.Linq namnområdet och de andra namnrymderna som stöder LINQ-frågor innehåller metoder som du kan anropa för att skapa och förfina frågor baserat på programmets behov. Visual Basic innehåller nyckelord för följande vanliga frågesatser. Mer information om Visual Basic-frågesatser finns i Frågor.

Från-sats

Antingen krävs en From sats eller en Aggregate sats för att starta en fråga. En From sats anger en källsamling och en iterationsvariabel för en fråga. Till exempel:

' Returns the company name for all customers for which
' the Country is equal to "Canada".
Dim names = From cust In customers
            Where cust.Country = "Canada"
            Select cust.CompanyName

Select-sats

Valfritt. En Select sats deklarerar en uppsättning iterationsvariabler för en fråga. Till exempel:

' Returns the company name and ID value for each
' customer as a collection of a new anonymous type.
Dim customerList = From cust In customers
                   Select cust.CompanyName, cust.CustomerID

Om en Select sats inte anges består iterationsvariablerna för frågan av de iterationsvariabler som anges av From -satsen eller Aggregate .

Where-sats

Valfritt. En Where sats anger ett filtreringsvillkor för en fråga. Till exempel:

' Returns all product names for which the Category of
' the product is "Beverages".
Dim names = From product In products
            Where product.Category = "Beverages"
            Select product.Name

Order By-sats

Valfritt. En Order By sats anger sorteringsordningen för kolumner i en fråga. Till exempel:

' Returns a list of books sorted by price in 
' ascending order.
Dim titlesAscendingPrice = From b In books
                           Order By b.price

Kopplingssats

Valfritt. En Join sats kombinerar två samlingar till en enda samling. Till exempel:

' Returns a combined collection of all of the 
' processes currently running and a descriptive
' name for the process taken from a list of 
' descriptive names.
Dim processes = From proc In Process.GetProcesses
                Join desc In processDescriptions
                  On proc.ProcessName Equals desc.ProcessName
                Select proc.ProcessName, proc.Id, desc.Description

Gruppera efter-sats

Valfritt. En Group By sats grupperar elementen i ett frågeresultat. Den kan användas för att tillämpa aggregeringsfunktioner på varje grupp. Till exempel:

' Returns a list of orders grouped by the order date
' and sorted in ascending order by the order date.
Dim orderList = From order In orders
                Order By order.OrderDate
                Group By OrderDate = order.OrderDate
                Into OrdersByDate = Group

Gruppkopplingssats

Valfritt. En Group Join sats kombinerar två samlingar i en enda hierarkisk samling. Till exempel:

' Returns a combined collection of customers and
' customer orders.
Dim customerList = From cust In customers
                   Group Join ord In orders On
                     cust.CustomerID Equals ord.CustomerID
                   Into CustomerOrders = Group,
                        TotalOfOrders = Sum(ord.Amount)
                   Select cust.CompanyName, cust.CustomerID,
                          CustomerOrders, TotalOfOrders

Aggregerad sats

Antingen krävs en Aggregate sats eller en From sats för att starta en fråga. En Aggregate sats tillämpar en eller flera aggregeringsfunktioner på en samling. Du kan till exempel använda Aggregate -satsen för att beräkna en summa för alla element som returneras av en fråga, som i följande exempel.

' Returns the sum of all order amounts.
Dim orderTotal = Aggregate order In orders
                 Into Sum(order.Amount)

Du kan också använda Aggregate -satsen för att ändra en fråga. Du kan till exempel använda Aggregate -satsen för att utföra en beräkning på en relaterad frågesamling. Till exempel:

' Returns the customer company name and largest 
' order amount for each customer.
Dim customerMax = From cust In customers
                  Aggregate order In cust.Orders
                  Into MaxOrder = Max(order.Amount)
                  Select cust.CompanyName, MaxOrder

Let-sats

Valfritt. En Let sats beräknar ett värde och tilldelar det till en ny variabel i frågan. Till exempel:

' Returns a list of products with a calculation of
' a ten percent discount.
Dim discountedProducts = From prod In products
                         Let Discount = prod.UnitPrice * 0.1
                         Where Discount >= 50
                         Select prod.Name, prod.UnitPrice, Discount

Distinct-sats

Valfritt. En Distinct sats begränsar värdena för den aktuella iterationsvariabeln för att eliminera duplicerade värden i frågeresultat. Till exempel:

' Returns a list of cities with no duplicate entries.
Dim cities = From item In customers
             Select item.City
             Distinct

Hoppa över sats

Valfritt. En Skip sats kringgår ett angivet antal element i en samling och returnerar sedan de återstående elementen. Till exempel:

' Returns a list of customers. The first 10 customers
' are ignored and the remaining customers are
' returned.
Dim customerList = From cust In customers
                   Skip 10

Hoppa över while-satsen

Valfritt. En Skip While sats kringgår element i en samling så länge ett angivet villkor är true och returnerar sedan de återstående elementen. Till exempel:

' Returns a list of customers. The query ignores all
' customers until the first customer for whom
' IsSubscriber returns false. That customer and all
' remaining customers are returned.
Dim customerList = From cust In customers
                   Skip While IsSubscriber(cust)

Take-sats

Valfritt. En Take sats returnerar ett angivet antal sammanhängande element från början av en samling. Till exempel:

' Returns the first 10 customers.
Dim customerList = From cust In customers
                   Take 10

Take While-sats

Valfritt. En Take While sats innehåller element i en samling så länge ett angivet villkor är true och kringgår de återstående elementen. Till exempel:

' Returns a list of customers. The query returns
' customers until the first customer for whom 
' HasOrders returns false. That customer and all 
' remaining customers are ignored.
Dim customersWithOrders = From cust In customers
                          Order By cust.Orders.Count Descending
                          Take While HasOrders(cust)

Använda ytterligare LINQ-frågefunktioner

Du kan använda ytterligare LINQ-frågefunktioner genom att anropa medlemmar i de uppräkningsbara och frågebara typer som tillhandahålls av LINQ. Du kan använda dessa ytterligare funktioner genom att anropa en viss frågeoperator på resultatet av ett frågeuttryck. I följande exempel används Enumerable.Union till exempel metoden för att kombinera resultatet av två frågor till ett frågeresultat. Den använder Enumerable.ToList metoden för att returnera frågeresultatet som en allmän lista.

Public Function GetAllCustomers() As List(Of Customer)
    Dim customers1 = From cust In domesticCustomers
    Dim customers2 = From cust In internationalCustomers

    Dim customerList = customers1.Union(customers2)

    Return customerList.ToList()
End Function

Mer information om ytterligare LINQ-funktioner finns i Översikt över vanliga frågeoperatorer.

Anslut till en databas med hjälp av LINQ till SQL

I Visual Basic identifierar du SQL Server-databasobjekt, till exempel tabeller, vyer och lagrade procedurer, som du vill komma åt med hjälp av en LINQ till SQL-fil. En LINQ till SQL-fil har ett tillägg av .dbml.

När du har en giltig anslutning till en SQL Server-databas kan du lägga till en LINQ-objektmall i SQL-klasser i projektet. Då visas objektrelationsdesignern (O/R-designern). Med O/R Designer kan du dra de objekt som du vill komma åt i koden från Server Explorer/Database Explorer till designerytan. LINQ till SQL-filen lägger till ett DataContext objekt i projektet. Det här objektet innehåller egenskaper och samlingar för de tabeller och vyer som du vill ha åtkomst till och metoder för de lagrade procedurer som du vill anropa. När du har sparat ändringarna i filen LINQ till SQL (.dbml) kan du komma åt dessa objekt i koden genom att referera till det DataContext objekt som definieras av O/R Designer. Objektet DataContext för projektet namnges baserat på namnet på linq-till-SQL-filen. Till exempel skapar en LINQ till SQL-fil med namnet Northwind.dbml ett DataContext objekt med namnet NorthwindDataContext.

Exempel med stegvisa instruktioner finns i Så här kör du frågor mot en databas och så här anropar du en lagrad procedur.

Visual Basic-funktioner som stöder LINQ

Visual Basic innehåller andra viktiga funktioner som gör användningen av LINQ enkel och minskar mängden kod som du måste skriva för att utföra LINQ-frågor. Dessa omfattar följande:

  • Anonyma typer som gör att du kan skapa en ny typ baserat på ett frågeresultat.

  • Implicit inskrivna variabler, som gör att du kan skjuta upp att ange en typ och låta kompilatorn härleda typen baserat på frågeresultatet.

  • Tilläggsmetoder som gör att du kan utöka en befintlig typ med dina egna metoder utan att ändra själva typen.

Mer information finns i Visual Basic-funktioner som stöder LINQ.

Uppskjuten och omedelbar frågekörning

Frågekörning är separat från att skapa en fråga. När en fråga har skapats utlöses körningen av en separat mekanism. En fråga kan köras så snart den har definierats (omedelbar körning) eller så kan definitionen lagras och frågan kan köras senare (uppskjuten körning).

När du skapar en fråga körs som standard inte själva frågan omedelbart. I stället lagras frågedefinitionen i variabeln som används för att referera till frågeresultatet. När frågeresultatvariabeln används senare i kod, till exempel i en For…Next loop, körs frågan. Den här processen kallas för uppskjuten körning.

Frågor kan också köras när de definieras, vilket kallas omedelbar körning. Du kan utlösa omedelbar körning genom att använda en metod som kräver åtkomst till enskilda element i frågeresultatet. Detta kan vara resultatet av att inkludera en aggregeringsfunktion, till exempel Count, Sum, Average, Mineller Max. Mer information om aggregerade funktioner finns i Aggregerad sats.

Användning av ToList metoderna eller ToArray framtvingar också omedelbar körning. Detta kan vara användbart när du vill köra frågan omedelbart och cachelagra resultatet. Mer information om dessa metoder finns i Konvertera datatyper.

Mer information om frågekörning finns i Skriva din första LINQ-fråga.

XML i Visual Basic

XML-funktionerna i Visual Basic innehåller XML-literaler och XML-axelegenskaper, vilket gör att du enkelt kan skapa, komma åt, fråga och ändra XML i koden. Med XML-literaler kan du skriva XML direkt i koden. Visual Basic-kompilatorn behandlar XML som ett förstklassigt dataobjekt.

I följande kodexempel visas hur du skapar ett XML-element, kommer åt dess underelement och attribut och frågar efter innehållet i elementet med hjälp av LINQ.

' Place Imports statements at the top of your program.
Imports <xmlns:ns="http://SomeNamespace">

Module Sample1

    Sub SampleTransform()

        ' Create test by using a global XML namespace prefix.

        Dim contact =
            <ns:contact>
                <ns:name>Patrick Hines</ns:name>
                <ns:phone ns:type="home">206-555-0144</ns:phone>
                <ns:phone ns:type="work">425-555-0145</ns:phone>
            </ns:contact>

        Dim phoneTypes =
          <phoneTypes>
              <%= From phone In contact.<ns:phone>
                  Select <type><%= phone.@ns:type %></type>
              %>
          </phoneTypes>

        Console.WriteLine(phoneTypes)
    End Sub

End Module

Mer information finns i XML.

Område beskrivning
XML Beskriver XML-funktionerna i Visual Basic som kan efterfrågas och som gör att du kan inkludera XML som förstklassiga dataobjekt i Visual Basic-koden.
Frågor Innehåller referensinformation om frågesatserna som är tillgängliga i Visual Basic.
LINQ (språkintegrerad fråga) Innehåller allmän information, programmeringsvägledning och exempel för LINQ.
LINQ till SQL Innehåller allmän information, programmeringsvägledning och exempel för LINQ till SQL.
LINQ till objekt Innehåller allmän information, programmeringsvägledning och exempel för LINQ till objekt.
LINQ till ADO.NET (portalsida) Innehåller länkar till allmän information, programmeringsvägledning och exempel för LINQ till ADO.NET.
LINQ till XML Innehåller allmän information, programmeringsvägledning och exempel för LINQ till XML.

Anvisningar och genomgångsavsnitt

Så här gör du: Fråga en databas

Anvisningar: Anropa en lagrad procedur

Gör så här: Ändra data i en databas

Anvisningar: Kombinera data med kopplingar

Anvisningar: Sortera frågeresultat

Anvisningar: Filtrera frågeresultat

Anvisningar: Antal, summa eller genomsnittliga data

Anvisningar: Hitta lägsta eller högsta värde i ett frågeresultat

Anvisningar: Tilldela lagrade procedurer för att utföra uppdateringar, infogningar och borttagningar (O/R Designer)

Kapitel 17: LINQ i Programmering Visual Basic 2008

Se även