Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
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), säkerställ att Option infer är inställt till På.
Lägga till en In-Memory 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
Studentklass och skapa en lista över instanser av klassen.Viktigt!
Koden som behövs för att definiera
Studentklassen 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
getStudentsmetoden för att lägga till en annan instans avStudentklassen i listan. Genom att lägga till den här eleven kommer du att bli introducerad till objektinitialiseringar. 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
Hitta platsen i
Mainmetoden 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 currentStudentVila muspekaren över
studentQueryi koden för att kontrollera att den kompilatortilldelade typen ärIEnumerable(Of Student).
Kör sökfrå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. För mer information om frågeexekvering, se Skriva din första LINQ-fråga.
Så här kör du frågan
Lägg till följande
For Eachloop under frågan i projektet.For Each studentRecord In studentQuery Console.WriteLine(studentRecord.Last & ", " & studentRecord.First) NextVila muspekaren över loopkontrollvariabeln
studentRecordför att se dess datatyp. Typen avstudentRecordhärleds tillStudent, eftersomstudentQueryreturnerar en samlingStudentinstanser.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 Bysats mellan -instruktionenWhereoch -instruktionenSelectför frågan.Order BySatsen sorterar resultaten alfabetiskt från A till Z, enligt varje elevs efternamn.Order By currentStudent.Last AscendingOm 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 AscendingDu kan också ange
Descendingatt 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) NextSkapa 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 Eachloopen 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 samlingStudentobjekt, men endast en medlem i varje objekt returneras: förnamnet på elever vars efternamn är Garcia. EftersomcurrentStudent.Firstär en sträng ärstudentQuery3datatypen för sekvensen som returneras avIEnumerable(Of String), en sekvens med strängar. Precis som i tidigare exempel lämnas tilldelningen av en datatyp förstudentQuery3kvar 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) NextVila muspekaren över
studentQuery3i 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 (
currentStudentposter i tidigare exempel) eller enkla fält (Firsti 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ältenSelecti -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
studentQuery4härledas eftersomSelectsatsen 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) NextSkapa 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: