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
Starta Visual Studio.
Peka på Nytt på Arkiv-menyn och klicka sedan på Projekt.
I listan Installerade mallar klickar du på Visual Basic.
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åden på sidan Referenser, Project Designer (Visual Basic) innehåller System.Linq också namnområdet.
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 avStudent
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, students
och ger åtkomst till egenskaperna för varje objekt i students
.
Skapa en enkel fråga
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
Vila muspekaren över
studentQuery
i koden för att kontrollera att den kompilatortilldelade typen ärIEnumerable(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
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
Vila muspekaren över loopkontrollvariabeln
studentRecord
för att se dess datatyp. Typen avstudentRecord
härleds tillStudent
, eftersomstudentQuery
returnerar en samlingStudent
instanser.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
Lägg till följande
Order By
sats mellan -instruktionenWhere
och -instruktionenSelect
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
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.Skapa och kör programmet genom att trycka på CTRL+F5. Observera resultatet i konsolfönstret.
Så här introducerar du en lokal identifierare
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
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
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 samlingStudent
objekt, men endast en medlem i varje objekt returneras: förnamnet på elever vars efternamn är Garcia. EftersomcurrentStudent.First
är en sträng ärIEnumerable(Of String)
datatypen för sekvensen som returneras avstudentQuery3
, en sekvens med strängar. Precis som i tidigare exempel lämnas tilldelningen av en datatyp förstudentQuery3
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
Vila muspekaren över
studentQuery3
i koden för att kontrollera att den tilldelade typen ärIEnumerable(Of String)
.Skapa och kör programmet genom att trycka på CTRL+F5. Observera resultatet i konsolfönstret.
Skapa en anonym typ i Select-satsen
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ältenSelect
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 eftersomSelect
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
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: