Dela via


Genomgång: Skriva frågor i Visual Basic

Den här genomgången visar hur du kan använda språkfunktioner i Visual Basic för att skriva LINQ-frågeuttryck (Language-Integrated Query). Genomgången visar hur du skapar frågor i en lista över studentobjekt, hur du kör frågorna och hur du ändrar dem. Frågorna innehåller flera funktioner, inklusive objektinitierare, slutsatsdragning av lokal typ och anonyma typer.

När du har slutfört den här genomgången är du redo att gå vidare till exemplen och dokumentationen för den specifika LINQ-providern som du är intresserad av. LINQ-leverantörer inkluderar LINQ till SQL, LINQ till DataSet och LINQ till XML.

Skapa ett projekt

Skapa ett konsolprogramprojekt

  1. Starta Visual Studio.

  2. Peka på Nytt på Arkiv-menyn och klicka sedan på Projekt.

  3. I listan Installerade mallar klickar du på Visual Basic.

  4. I listan över projekttyper klickar du på Konsolprogram. I rutan Namn skriver du ett namn för projektet och klickar sedan på OK.

    Ett projekt skapas. Som standard innehåller den en referens till System.Core.dll. Listan Importerade namnområdensidan Referenser, Project Designer (Visual Basic) innehåller System.Linq också namnområdet.

  5. På kompileringssidan , Projektdesigner (Visual Basic), kontrollerar du att Alternativ härledning är inställt på På.

Lägga till en minnesintern datakälla

Datakällan för frågorna i den här genomgången är en lista över Student objekt. Varje Student objekt innehåller ett förnamn, ett efternamn, ett klassår och en akademisk rangordning i studentkroppen.

Så här lägger du till datakällan

  • Definiera en Student klass och skapa en lista över instanser av klassen.

    Viktigt!

    Koden som behövs för att definiera Student klassen och skapa listan som används i genomgångsexemplen finns i Så här skapar du en lista med objekt. Du kan kopiera den därifrån och klistra in den i projektet. Den nya koden ersätter den kod som visades när du skapade projektet.

Så här lägger du till en ny elev i studentlistan

  • Följ mönstret i getStudents metoden för att lägga till en annan instans av Student klassen i listan. Genom att lägga till eleven presenteras objektinitierare. Mer information finns i Objektinitierare: Namngivna och anonyma typer.

Skapa en fråga

När den körs skapar frågan som läggs till i det här avsnittet en lista över de studenter vars akademiska rang placerar dem bland de tio främsta. Eftersom frågan väljer det fullständiga Student objektet varje gång är IEnumerable(Of Student)typen av frågeresultat . Frågans typ anges dock vanligtvis inte i frågedefinitioner. Kompilatorn använder i stället lokal typinferens för att fastställa typen. Mer information finns i Slutsatsdragning av lokal typ. Frågans intervallvariabel, currentStudent, fungerar som en referens till varje Student instans i källan, studentsoch ger åtkomst till egenskaperna för varje objekt i students.

Skapa en enkel fråga

  1. Hitta platsen i Main metoden för projektet som är markerad på följande sätt:

    ' ****Paste query and query execution code from the walkthrough,
    ' ****or any code of your own, here in Main.
    

    Kopiera följande kod och klistra in den.

    Dim studentQuery = From currentStudent In students
                       Where currentStudent.Rank <= 10
                       Select currentStudent
    
  2. Vila muspekaren över studentQuery i koden för att kontrollera att den kompilatortilldelade typen är IEnumerable(Of Student).

Kör frågan

Variabeln studentQuery innehåller definitionen av frågan, inte resultatet av att köra frågan. En typisk mekanism för att köra en fråga är en For Each loop. Varje element i den returnerade sekvensen nås via loop-iterationsvariabeln. Mer information om frågekörning finns i Skriva din första LINQ-fråga.

Så här kör du frågan

  1. Lägg till följande For Each loop under frågan i projektet.

    For Each studentRecord In studentQuery
        Console.WriteLine(studentRecord.Last & ", " & studentRecord.First)
    Next
    
  2. Vila muspekaren över loopkontrollvariabeln studentRecord för att se dess datatyp. Typen av studentRecord härleds till Student, eftersom studentQuery returnerar en samling Student instanser.

  3. Skapa och kör programmet genom att trycka på CTRL+F5. Observera resultatet i konsolfönstret.

Ändra frågan

Det är lättare att skanna frågeresultat om de är i en angiven ordning. Du kan sortera den returnerade sekvensen baserat på alla tillgängliga fält.

Så här beställer du resultatet

  1. Lägg till följande Order By sats mellan -instruktionen Where och -instruktionen Select för frågan. Order By Satsen beställer resultaten alfabetiskt från A till Z, enligt varje elevs efternamn.

    Order By currentStudent.Last Ascending
    
  2. Om du vill beställa efter efternamn och sedan förnamn lägger du till båda fälten i frågan:

    Order By currentStudent.Last Ascending, currentStudent.First Ascending
    

    Du kan också ange Descending att beställa från Z till A.

  3. Skapa och kör programmet genom att trycka på CTRL+F5. Observera resultatet i konsolfönstret.

Så här introducerar du en lokal identifierare

  1. Lägg till koden i det här avsnittet för att introducera en lokal identifierare i frågeuttrycket. Den lokala identifieraren innehåller ett mellanliggande resultat. I följande exempel name är en identifierare som innehåller en sammanlänkning av elevens för- och efternamn. En lokal identifierare kan användas för enkelhetens skull eller förbättra prestandan genom att lagra resultatet av ett uttryck som annars skulle beräknas flera gånger.

    Dim studentQuery2 =
            From currentStudent In students
            Let name = currentStudent.Last & ", " & currentStudent.First
            Where currentStudent.Year = "Senior" And currentStudent.Rank <= 10
            Order By name Ascending
            Select currentStudent
    
    ' If you see too many results, comment out the previous
    ' For Each loop.
    For Each studentRecord In studentQuery2
        Console.WriteLine(studentRecord.Last & ", " & studentRecord.First)
    Next
    
  2. Skapa och kör programmet genom att trycka på CTRL+F5. Observera resultatet i konsolfönstret.

Så här projicerar du ett fält i Select-satsen

  1. Lägg till frågan och For Each loopen från det här avsnittet för att skapa en fråga som skapar en sekvens vars element skiljer sig från elementen i källan. I följande exempel är källan en samling Student objekt, men endast en medlem i varje objekt returneras: förnamnet på elever vars efternamn är Garcia. Eftersom currentStudent.First är en sträng är IEnumerable(Of String)datatypen för sekvensen som returneras av studentQuery3 , en sekvens med strängar. Precis som i tidigare exempel lämnas tilldelningen av en datatyp för studentQuery3 kvar för kompilatorn att avgöra med hjälp av lokal typinferens.

    Dim studentQuery3 = From currentStudent In students
                        Where currentStudent.Last = "Garcia"
                        Select currentStudent.First
    
    ' If you see too many results, comment out the previous
    ' For Each loops.
    For Each studentRecord In studentQuery3
        Console.WriteLine(studentRecord)
    Next
    
  2. Vila muspekaren över studentQuery3 i koden för att kontrollera att den tilldelade typen är IEnumerable(Of String).

  3. Skapa och kör programmet genom att trycka på CTRL+F5. Observera resultatet i konsolfönstret.

Skapa en anonym typ i Select-satsen

  1. Lägg till koden från det här avsnittet för att se hur anonyma typer används i frågor. Du använder dem i frågor när du vill returnera flera fält från datakällan i stället för att slutföra poster (currentStudent poster i tidigare exempel) eller enkla fält (First i föregående avsnitt). I stället för att definiera en ny namngiven typ som innehåller de fält som du vill inkludera i resultatet anger du fälten Select i -satsen och kompilatorn skapar en anonym typ med dessa fält som egenskaper. Mer information finns i Anonyma typer.

    I följande exempel skapas en fråga som returnerar namnet och rangordningen för seniorer vars akademiska rang är mellan 1 och 10, i ordning efter akademisk rangordning. I det här exemplet måste typen av studentQuery4 härledas eftersom Select satsen returnerar en instans av en anonym typ och en anonym typ inte har något användbart namn.

    Dim studentQuery4 =
            From currentStudent In students
            Where currentStudent.Year = "Senior" And currentStudent.Rank <= 10
            Order By currentStudent.Rank Ascending
            Select currentStudent.First, currentStudent.Last, currentStudent.Rank
    
    ' If you see too many results, comment out the previous
    ' For Each loops.
    For Each studentRecord In studentQuery4
        Console.WriteLine(studentRecord.Last & ", " & studentRecord.First &
                          ":  " & studentRecord.Rank)
    Next
    
  2. Skapa och kör programmet genom att trycka på CTRL+F5. Observera resultatet i konsolfönstret.

Ytterligare exempel

Nu när du förstår grunderna är följande en lista med ytterligare exempel för att illustrera flexibiliteten och kraften i LINQ-frågor. Varje exempel föregås av en kort beskrivning av vad det gör. Vila muspekaren över frågeresultatvariabeln för varje fråga för att se den härledda typen. Använd en For Each loop för att generera resultatet.

' Find all students who are seniors.
Dim q1 = From currentStudent In students
         Where currentStudent.Year = "Senior"
         Select currentStudent

' Write a For Each loop to execute the query.
For Each q In q1
    Console.WriteLine(q.First & " " & q.Last)
Next

' Find all students with a first name beginning with "C".
Dim q2 = From currentStudent In students
         Where currentStudent.First.StartsWith("C")
         Select currentStudent

' Find all top ranked seniors (rank < 40).
Dim q3 = From currentStudent In students
         Where currentStudent.Rank < 40 And currentStudent.Year = "Senior"
         Select currentStudent

' Find all seniors with a lower rank than a student who 
' is not a senior.
Dim q4 = From student1 In students, student2 In students
         Where student1.Year = "Senior" And student2.Year <> "Senior" And
               student1.Rank > student2.Rank
         Select student1
         Distinct

' Retrieve the full names of all students, sorted by last name.
Dim q5 = From currentStudent In students
         Order By currentStudent.Last
         Select Name = currentStudent.First & " " & currentStudent.Last

' Determine how many students are ranked in the top 20.
Dim q6 = Aggregate currentStudent In students
         Where currentStudent.Rank <= 20
         Into Count()

' Count the number of different last names in the group of students.
Dim q7 = Aggregate currentStudent In students
         Select currentStudent.Last
         Distinct
         Into Count()

' Create a list box to show the last names of students.
Dim lb As New System.Windows.Forms.ListBox
Dim q8 = From currentStudent In students
         Order By currentStudent.Last
         Select currentStudent.Last Distinct

For Each nextName As String In q8
    lb.Items.Add(nextName)
Next

' Find every process that has a lowercase "h", "l", or "d" in its name.
Dim letters() As String = {"h", "l", "d"}
Dim q9 = From proc In System.Diagnostics.Process.GetProcesses,
         letter In letters
         Where proc.ProcessName.Contains(letter)
         Select proc

For Each proc In q9
    Console.WriteLine(proc.ProcessName & ", " & proc.WorkingSet64)
Next

Ytterligare Information

När du är bekant med de grundläggande begreppen för att arbeta med frågor är du redo att läsa dokumentationen och exemplen för den specifika typ av LINQ-provider som du är intresserad av:

Se även