Grundläggande frågeåtgärder (Visual Basic)
Det här avsnittet innehåller en kort introduktion till LINQ-uttryck (Language-Integrated Query) i Visual Basic och några av de typiska typer av åtgärder som du utför i en fråga. Mer information finns i följande avsnitt:
Introduktion till LINQ i Visual Basic
Genomgång: Skriva frågor i Visual Basic
Ange datakällan (från)
I en LINQ-fråga är det första steget att ange den datakälla som du vill fråga efter. Därför From
kommer satsen i en fråga alltid först. Frågeoperatorer väljer och formar resultatet baserat på källans typ.
Dim query = From cust In customers
' ...
Satsen From
anger datakällan , customers
och en intervallvariabel, cust
. Intervallvariabeln är som en loop-iterationsvariabel, förutom att ingen faktisk iteration inträffar i ett frågeuttryck. När frågan körs, ofta med hjälp av en For Each
loop, fungerar intervallvariabeln som en referens till varje efterföljande element i customers
. Eftersom kompilatorn kan härleda typen av cust
behöver du inte uttryckligen ange den. Exempel på frågor som skrivits med och utan explicit inmatning finns i Type Relationships in Query Operations (Visual Basic).
Mer information om hur du använder From
-satsen i Visual Basic finns i Från-satsen.
Filtrera data (var)
Förmodligen är den vanligaste frågeåtgärden att tillämpa ett filter i form av ett booleskt uttryck. Frågan returnerar sedan endast de element som uttrycket är sant för. En Where
sats används för att utföra filtreringen. Filtret anger vilka element i datakällan som ska inkluderas i den resulterande sekvensen. I följande exempel ingår endast de kunder som har en adress i London.
Dim londonCusts = From cust In customers
Where cust.City = "London"
' ...
Du kan använda logiska operatorer som And
och Or
för att kombinera filteruttryck i en Where
sats. Om du till exempel bara vill returnera de kunder som kommer från London och vars namn är Devon använder du följande kod:
Where cust.City = "London" And cust.Name = "Devon"
Om du vill returnera kunder från London eller Paris använder du följande kod:
Where cust.City = "London" Or cust.City = "Paris"
Mer information om hur du använder Where
-satsen i Visual Basic finns i Where-satsen.
Beställa data (sortera efter)
Det är ofta praktiskt att sortera returnerade data i en viss ordning. Order By
Satsen gör att elementen i den returnerade sekvensen sorteras efter ett angivet fält eller fält. Följande fråga sorterar till exempel resultatet baserat på egenskapen Name
. Eftersom Name
är en sträng sorteras de returnerade data alfabetiskt, från A till Z.
Dim londonCusts1 = From cust In customers
Where cust.City = "London"
Order By cust.Name Ascending
' ...
Om du vill sortera resultatet i omvänd ordning, från Z till A, använder du Order By...Descending
-satsen. Standardvärdet är Ascending
när varken Ascending
eller Descending
har angetts.
Mer information om hur du använder Order By
satsen i Visual Basic finns i Order By-satsen.
Välja data (välj)
Satsen Select
anger formuläret och innehållet i returnerade element. Du kan till exempel ange om resultatet ska bestå av fullständiga Customer
objekt, bara en Customer
egenskap, en delmängd av egenskaper, en kombination av egenskaper från olika datakällor eller någon ny resultattyp baserat på en beräkning. Select
När satsen genererar något annat än en kopia av källelementet kallas åtgärden för en projektion.
Om du vill hämta en samling som består av fullständiga Customer
objekt väljer du själva intervallvariabeln:
Dim londonCusts2 = From cust In customers
Where cust.City = "London"
Order By cust.Name Ascending
Select cust
Om en Customer
instans är ett stort objekt som har många fält, och allt du vill hämta är namnet, kan du välja cust.Name
, som du ser i följande exempel. Slutsatsdragning av lokal typ identifierar att detta ändrar resultattypen från en samling Customer
objekt till en samling strängar.
Dim londonCusts3 = From cust In customers
Where cust.City = "London"
Order By cust.Name Ascending
Select cust.Name
Om du vill välja flera fält från datakällan har du två alternativ:
I -
Select
satsen anger du de fält som du vill inkludera i resultatet. Kompilatorn definierar en anonym typ som har dessa fält som egenskaper. Mer information finns i Anonyma typer.Eftersom de returnerade elementen i följande exempel är instanser av en anonym typ kan du inte referera till typen efter namn någon annanstans i koden. Det kompilatorspecifika namnet för typen innehåller tecken som inte är giltiga i normal Visual Basic-kod. I följande exempel är elementen i samlingen som returneras av frågan i
londonCusts4
instanser av en anonym typDim londonCusts4 = From cust In customers Where cust.City = "London" Order By cust.Name Ascending Select Name = cust.Name, Phone = cust.Phone For Each londonCust In londonCusts4 Console.WriteLine(londonCust.Name & " " & londonCust.Phone) Next
-eller-
Definiera en namngiven typ som innehåller de fält som du vill inkludera i resultatet och skapa och initiera instanser av typen i
Select
-satsen. Använd endast det här alternativet om du behöver använda enskilda resultat utanför samlingen där de returneras, eller om du måste skicka dem som parametrar i metodanrop. Typen avlondonCusts5
i följande exempel är IEnumerable(Of Name Telefon).Public Class NamePhone Public Name As String Public Phone As String ' Additional class elements End Class
Dim londonCusts5 = From cust In customers Where cust.City = "London" Order By cust.Name Ascending Select New NamePhone With {.Name = cust.Name, .Phone = cust.Phone}
Mer information om hur du använder Select
-satsen i Visual Basic finns i Välj sats.
Ansluta till data (koppla till och koppla samman)
Du kan kombinera mer än en datakälla i From
-satsen på flera sätt. Följande kod använder till exempel två datakällor och kombinerar implicit egenskaper från båda i resultatet. Frågan väljer elever vars efternamn börjar med en vokal.
Dim vowels() As String = {"A", "E", "I", "O", "U"}
Dim vowelNames = From student In students, vowel In vowels
Where student.Last.IndexOf(vowel) = 0
Select Name = student.First & " " &
student.Last, Initial = vowel
Order By Initial
For Each vName In vowelNames
Console.WriteLine(vName.Initial & ": " & vName.Name)
Next
Kommentar
Du kan köra den här koden med listan över elever som skapats i Så här skapar du en lista med objekt.
Nyckelordet Join
motsvarar ett INNER JOIN
i SQL. Den kombinerar två samlingar baserat på matchande nyckelvärden mellan element i de två samlingarna. Frågan returnerar alla eller en del av samlingselementen som har matchande nyckelvärden. Följande kod duplicerar till exempel åtgärden för den tidigare implicita kopplingen.
Dim vowelNames2 = From student In students
Join vowel In vowels
On student.Last(0) Equals vowel
Select Name = student.First & " " &
student.Last, Initial = vowel
Order By Initial
Group Join
kombinerar samlingar till en enda hierarkisk samling, precis som en LEFT JOIN
i SQL. Mer information finns i Join-satsen och gruppkopplingssatsen.
Gruppera data (gruppera efter)
Du kan lägga till en Group By
sats för att gruppera elementen i ett frågeresultat enligt ett eller flera fält i elementen. Följande kod grupperar till exempel elever efter klassår.
Dim studentsByYear = From student In students
Select student
Group By year = student.Year
Into Classes = Group
For Each yearGroup In studentsByYear
Console.WriteLine(vbCrLf & "Year: " & yearGroup.year)
For Each student In yearGroup.Classes
Console.WriteLine(" " & student.Last & ", " & student.First)
Next
Next
Om du kör den här koden med hjälp av listan över elever som skapats i Så här skapar du en lista med objekt, är utdata från -instruktionen For Each
:
År: Junior
Tucker, Michael
Garcia, Hugo
Garcia, Debra
Tucker, Lance
År: Senior
Omelchenko, Svetlana
Osada, Michiko
Fakhouri, Fadi
Feng, Hanying
Adams, Terry
År: Förstaårselev
Mortensen, Sven
Garcia, Cesar
Varianten som visas i följande kod beställer klassåren och beställer sedan eleverna inom varje år efter efternamn.
Dim studentsByYear2 = From student In students
Select student
Order By student.Year, student.Last
Group By year = student.Year
Into Classes = Group
Mer information om Group By
finns i Gruppera efter-sats.