Delen via


Overzicht: Query's schrijven in Visual Basic

In dit scenario ziet u hoe u Visual Basic-taalfuncties kunt gebruiken om LINQ-queryexpressies (Language-Integrated Query) te schrijven. In het overzicht ziet u hoe u query's maakt in een lijst met studentobjecten, hoe u de query's uitvoert en hoe u deze kunt wijzigen. De query's bevatten verschillende functies, waaronder object-initialisatiefuncties, deductie van het lokale type en anonieme typen.

Nadat u deze procedure hebt voltooid, bent u klaar om verder te gaan met de voorbeelden en documentatie voor de specifieke LINQ-provider waarin u geïnteresseerd bent. LINQ-providers omvatten LINQ naar SQL, LINQ naar DataSet en LINQ naar XML.

Een project maken

Een consoletoepassingsproject maken

  1. Start Visual Studio.

  2. Wijs in het menu Bestand de optie Nieuw aan en klik op Project.

  3. Klik in de lijst Geïnstalleerde sjablonen op Visual Basic.

  4. Klik in de lijst met projecttypen op Consoletoepassing. Typ een naam voor het project in het vak Naam en klik op OK.

    Er wordt een project gemaakt. Deze bevat standaard een verwijzing naar System.Core.dll. De lijst met geïmporteerde naamruimten op de referentiepagina bevat Project Designer (Visual Basic) ook de System.Linq naamruimte.

  5. Controleerop de pagina Compileren of Project Designer (Visual Basic) is ingesteld op Aan.

Een in-memory gegevensbron toevoegen

De gegevensbron voor de query's in dit scenario is een lijst Student met objecten. Elk Student object bevat een voornaam, een achternaam, een klasjaar en een academische rang in de hoofdtekst van de student.

De gegevensbron toevoegen

  • Definieer een Student klasse en maak een lijst met exemplaren van de klasse.

    Belangrijk

    De code die nodig is om de Student klasse te definiëren en de lijst te maken die wordt gebruikt in de overzichtsvoorbeelden, vindt u in Procedure: Een lijst met items maken. U kunt het van daaruit kopiëren en in uw project plakken. De nieuwe code vervangt de code die werd weergegeven toen u het project maakte.

Een nieuwe leerling/student toevoegen aan de lijst met leerlingen/studenten

  • Volg het patroon in de getStudents methode om een ander exemplaar van de Student klasse toe te voegen aan de lijst. Als u de student toevoegt, maakt u kennis met object-initializers. Zie Object initializers: Named and Anonymous Types voor meer informatie.

Een query maken

Wanneer deze wordt uitgevoerd, produceert de query die in deze sectie is toegevoegd een lijst met de studenten waarvan de academische rang ze in de top tien plaatst. Omdat de query telkens het volledige Student object selecteert, is IEnumerable(Of Student)het type van het queryresultaat. Het type van de query wordt doorgaans echter niet opgegeven in querydefinities. In plaats daarvan gebruikt de compiler deductie van het lokale type om het type te bepalen. Zie Deductie van lokaal type voor meer informatie. De bereikvariabele van de query, currentStudentfungeert als een verwijzing naar elk Student exemplaar in de bron, studentswaarmee toegang wordt geboden tot de eigenschappen van elk object in students.

Een eenvoudige query maken

  1. Zoek de plaats in de Main methode van het project die als volgt is gemarkeerd:

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

    Kopieer de volgende code en plak deze in.

    Dim studentQuery = From currentStudent In students
                       Where currentStudent.Rank <= 10
                       Select currentStudent
    
  2. Plaats de muis aanwijzer studentQuery in uw code om te controleren of het door de compiler toegewezen type is IEnumerable(Of Student).

De query uitvoeren

De variabele studentQuery bevat de definitie van de query, niet de resultaten van het uitvoeren van de query. Een typisch mechanisme voor het uitvoeren van een query is een For Each lus. Elk element in de geretourneerde reeks wordt geopend via de herhalingsvariabele van de lus. Zie Uw eerste LINQ-query schrijven voor meer informatie over het uitvoeren van query's.

De query uitvoeren

  1. Voeg de volgende For Each lus toe onder de query in uw project.

    For Each studentRecord In studentQuery
        Console.WriteLine(studentRecord.Last & ", " & studentRecord.First)
    Next
    
  2. Plaats de muiswijzer op de lusbesturingsvariabele studentRecord om het gegevenstype ervan te zien. Het type studentRecord wordt afgeleid, Studentomdat studentQuery een verzameling Student exemplaren wordt geretourneerd.

  3. Bouw de toepassing en voer deze uit door op Ctrl+F5 te drukken. Noteer de resultaten in het consolevenster.

De query wijzigen

Het is eenvoudiger om queryresultaten te scannen als ze zich in een opgegeven volgorde bevinden. U kunt de geretourneerde volgorde sorteren op basis van elk beschikbaar veld.

De resultaten ordenen

  1. Voeg de volgende Order By component toe tussen de Where instructie en de Select instructie van de query. De Order By component rangschikt de resultaten alfabetisch van A tot Z, volgens de achternaam van elke student.

    Order By currentStudent.Last Ascending
    
  2. Als u wilt orden op achternaam en vervolgens op voornaam, voegt u beide velden toe aan de query:

    Order By currentStudent.Last Ascending, currentStudent.First Ascending
    

    U kunt ook opgeven Descending om van Z naar A te bestellen.

  3. Bouw de toepassing en voer deze uit door op Ctrl+F5 te drukken. Noteer de resultaten in het consolevenster.

Een lokale id introduceren

  1. Voeg de code in deze sectie toe om een lokale id in de query-expressie te introduceren. De lokale id bevat een tussenliggend resultaat. In het volgende voorbeeld name is een id die een samenvoeging van de voor- en achternamen van de leerling/student bevat. Een lokale id kan voor het gemak worden gebruikt of de prestaties verbeteren door de resultaten van een expressie op te slaan die anders meerdere keren zou worden berekend.

    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. Bouw de toepassing en voer deze uit door op Ctrl+F5 te drukken. Noteer de resultaten in het consolevenster.

Eén veld in de select-component projecteren

  1. Voeg de query en For Each lus uit deze sectie toe om een query te maken die een reeks produceert waarvan de elementen verschillen van de elementen in de bron. In het volgende voorbeeld is de bron een verzameling Student objecten, maar slechts één lid van elk object wordt geretourneerd: de voornaam van studenten waarvan de achternaam Garcia is. Omdat currentStudent.First dit een tekenreeks is, is IEnumerable(Of String)het gegevenstype van de reeks die wordt studentQuery3 geretourneerd, een reeks tekenreeksen. Net als in eerdere voorbeelden wordt de toewijzing van een gegevenstype studentQuery3 voor de compiler overgelaten om te bepalen met behulp van lokale typedeductie.

    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. Plaats de muis aanwijzer studentQuery3 in uw code om te controleren of het toegewezen type is IEnumerable(Of String).

  3. Bouw de toepassing en voer deze uit door op Ctrl+F5 te drukken. Noteer de resultaten in het consolevenster.

Een anoniem type maken in de select-component

  1. Voeg de code uit deze sectie toe om te zien hoe anonieme typen worden gebruikt in query's. U gebruikt deze in query's wanneer u meerdere velden uit de gegevensbron wilt retourneren in plaats van volledige records (currentStudent records in eerdere voorbeelden) of enkele velden (First in de vorige sectie). In plaats van een nieuw benoemd type te definiëren dat de velden bevat die u wilt opnemen in het resultaat, geeft u de velden in de Select component op en maakt de compiler een anoniem type met deze velden als eigenschappen. Zie Anonieme typen voor meer informatie.

    In het volgende voorbeeld wordt een query gemaakt die de naam en rang van senioren retourneert waarvan de academische rang tussen 1 en 10 ligt, in volgorde van academische rang. In dit voorbeeld moet het type studentQuery4 worden afgeleid omdat de Select component een exemplaar van een anoniem type retourneert en een anoniem type geen bruikbare naam heeft.

    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. Bouw de toepassing en voer deze uit door op Ctrl+F5 te drukken. Noteer de resultaten in het consolevenster.

Aanvullende voorbeelden

Nu u de basisbeginselen begrijpt, ziet u hieronder een lijst met aanvullende voorbeelden om de flexibiliteit en kracht van LINQ-query's te illustreren. Elk voorbeeld wordt voorafgegaan door een korte beschrijving van wat het doet. Plaats de muiswijzer op de queryresultaatvariabele voor elke query om het uitgestelde type weer te geven. Gebruik een For Each lus om de resultaten te produceren.

' 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

Aanvullende informatie

Nadat u bekend bent met de basisconcepten van het werken met query's, kunt u de documentatie en voorbeelden lezen voor het specifieke type LINQ-provider waarin u geïnteresseerd bent:

Zie ook