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
, Min
eller 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.
Relaterade resurser
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
Aktuella bokkapitel
Kapitel 17: LINQ i Programmering Visual Basic 2008