Dela via


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

Frågor

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 , customersoch 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 custbehö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 typ

    Dim 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 av londonCusts5 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 Byfinns i Gruppera efter-sats.

Se även