Megosztás a következőn keresztül:


Útmutató: Lekérdezések írása a Visual Basicben

Ez az útmutató bemutatja, hogyan írhat Language-Integrated Lekérdezés (LINQ) lekérdezési kifejezéseket a Visual Basic nyelvi funkcióival. Az útmutató bemutatja, hogyan hozhat létre lekérdezéseket a Student-objektumok listájában, hogyan futtathatja a lekérdezéseket, és hogyan módosíthatja őket. A lekérdezések számos funkciót tartalmaznak, többek között az objektum inicializálóit, a helyi típusú következtetést és a névtelen típusokat.

Az útmutató elvégzése után készen áll arra, hogy továbblépjen a kívánt LINQ-szolgáltató mintáira és dokumentációjára. A LINQ-szolgáltatók közé tartozik a LINQ–SQL, a LINQ to DataSet és a LINQ–XML.

Projekt létrehozása

Konzolalkalmazás-projekt létrehozása

  1. Indítsa el a Visual Studiót.

  2. A Fájl menüben mutasson az Újelemre, majd kattintson a Projektlehetőségre.

  3. A Telepített sablonok listában kattintson a Visual Basic gombra.

  4. A projekttípusok listájában kattintson a Konzolalkalmazás elemre. A Név mezőbe írja be a projekt nevét, majd kattintson az OK gombra.

    Létrejön egy projekt. Alapértelmezés szerint a System.Core.dllhivatkozását tartalmazza. Emellett a Hivatkozások lapon található Importált névterek lista, a Project Designer (Visual Basic) tartalmazza a System.Linq névteret.

  5. A Fordítás lap, Projekt Tervező (Visual Basic) oldalon győződjön meg arról, hogy az Option infer beállítása bekapcsolva.

In-Memory adatforrás hozzáadása

Az útmutatóban szereplő lekérdezések adatforrása egy Student objektumok listája. Minden Student objektum tartalmaz egy utónevet, egy vezetéknevet, egy osztályévet és egy tudományos rangot a tanulói testületben.

Az adatforrás hozzáadása

  • Definiáljon egy osztályt Student , és hozza létre az osztály példányainak listáját.

    Fontos

    Az osztály definiálásához Student és az útmutató példáiban használt lista létrehozásához szükséges kód az Útmutató: Elemek listájának létrehozása című témakörben található. Innen másolhatja, és beillesztheti a projektbe. Az új kód felülírja a projekt létrehozásakor megjelent kódot.

Új tanuló hozzáadása a tanulók listájához

  • A metódusban szereplő getStudents mintát követve adjon hozzá egy másik osztálypéldányt Student a listához. A tanuló hozzáadása megismertet az objektum inicializálóival. További információ: Object Initializers: Named and Anonymous Types.

Lekérdezés létrehozása

A végrehajtáskor az ebben a szakaszban hozzáadott lekérdezés létrehozza azoknak a diákoknak a listáját, akiknek a tudományos rangja az első tízbe helyezi őket. Mivel a lekérdezés minden alkalommal kiválasztja a teljes Student objektumot, a lekérdezés eredményének típusa a IEnumerable(Of Student)következő. A lekérdezés típusa azonban általában nincs megadva a lekérdezésdefiníciókban. Ehelyett a fordító helyi típusú következtetést használ a típus meghatározásához. További információ: Helyi típus következtetése. A lekérdezés tartományváltozója a currentStudentforrás minden Student példányára hivatkozik, studentsés hozzáférést biztosít az egyes objektumok tulajdonságaihoz a forrásban students.

Egyszerű lekérdezés létrehozása

  1. Keresse meg a Main projekt metódusában az alábbi módon megjelölt helyet:

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

    Másolja ki a következő kódot, és illessze be.

    Dim studentQuery = From currentStudent In students
                       Where currentStudent.Rank <= 10
                       Select currentStudent
    
  2. A kódban vigye az egérmutatót a studentQuery fölé, hogy ellenőrizze, a fordító által hozzárendelt típus IEnumerable(Of Student).

A lekérdezés futtatása

A változó studentQuery a lekérdezés definícióját tartalmazza, nem a lekérdezés futtatásának eredményeit. A lekérdezések futtatásának tipikus mechanizmusa egy For Each hurok. A visszaadott sorozat minden eleme a ciklus iterációs változójával érhető el. A lekérdezések végrehajtásával kapcsolatos további információkért lásd : Az első LINQ-lekérdezés írása.

A lekérdezés futtatása

  1. Adja hozzá a következő For Each hurkot a projekt lekérdezése alatt.

    For Each studentRecord In studentQuery
        Console.WriteLine(studentRecord.Last & ", " & studentRecord.First)
    Next
    
  2. Az egérmutatót a hurokvezérlő változó studentRecord fölé húzva láthatja az adattípusát. A(z) studentRecord típusát Student-nek/nak értelmezi a rendszer, mert studentQuery egy Student példányokból álló gyűjteményt ad vissza.

  3. Hozza létre és futtassa az alkalmazást a CTRL+F5 billentyűkombináció lenyomásával. Figyelje meg az eredményeket a konzolablakban.

A lekérdezés módosítása

A lekérdezési eredmények könnyebben beolvashatóak, ha egy megadott sorrendben vannak. A visszaadott sorozatot bármely elérhető mező alapján rendezheti.

Az eredmények sorrendje

  1. Adja hozzá a következő Order By záradékot az Where utasítás és a Select lekérdezés utasítása között. A Order By záradék betűrendbe rendezi az eredményeket A-tól Z-ig az egyes tanulók vezetékneve szerint.

    Order By currentStudent.Last Ascending
    
  2. Ha vezetéknév, majd utónév szerint szeretne sorrendet rendelni, adja hozzá mindkét mezőt a lekérdezéshez:

    Order By currentStudent.Last Ascending, currentStudent.First Ascending
    

    Azt is megadhatja Descending , hogy Z-től A-ig rendeljen.

  3. Hozza létre és futtassa az alkalmazást a CTRL+F5 billentyűkombináció lenyomásával. Figyelje meg az eredményeket a konzolablakban.

Helyi azonosító bevezetése

  1. Adja hozzá az ebben a szakaszban található kódot, hogy egy helyi azonosítót vezessen be a lekérdezési kifejezésben. A helyi azonosító köztes eredményt fog tárolni. Az alábbi példában egy olyan azonosító látható, name amely a tanuló vezeték- és utóneveinek összefűződését tartalmazza. A helyi azonosítók kényelmesen használhatók, vagy növelhetik a teljesítményt egy olyan kifejezés eredményeinek tárolásával, amelyeket egyébként többször is kiszámítanak.

    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. Hozza létre és futtassa az alkalmazást a CTRL+F5 billentyűkombináció lenyomásával. Figyelje meg az eredményeket a konzolablakban.

Egy mező kivetítése a Select záradékban

  1. Adja hozzá a lekérdezést és For Each a ciklust ebből a szakaszból egy olyan lekérdezés létrehozásához, amely olyan sorozatot hoz létre, amelynek elemei eltérnek a forrás elemeitől. A következő példában a forrás objektumgyűjtemény Student , de az egyes objektumoknak csak egy tagja lesz visszaadva: azoknak a diákoknak a vezetékneve, akiknek a vezetékneve Garcia. Mivel currentStudent.First egy sztring, a visszaadott studentQuery3IEnumerable(Of String) sorozat adattípusa sztringek sorozata. A korábbi példákhoz hasonlóan, a fordítóra van bízva az studentQuery3 adat típusának hozzárendelése, amelyet helyi típusú következtetéssel határoz meg.

    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. Vigye az egérmutatót a studentQuery3-ra a kódban, hogy ellenőrizze, a hozzárendelt típus IEnumerable(Of String).

  3. Hozza létre és futtassa az alkalmazást a CTRL+F5 billentyűkombináció lenyomásával. Figyelje meg az eredményeket a konzolablakban.

Névtelen típus létrehozása a Select záradékban

  1. Adja hozzá az ebből a szakaszból származó kódot, hogy lássa, hogyan használják a névtelen típusokat a lekérdezések. A lekérdezésekben akkor használja őket, ha több mezőt szeretne visszaadni az adatforrásból a teljes rekordok (currentStudent korábbi példák rekordjai) vagy egyetlen mezők helyett (First az előző szakaszban). Az eredménybe felvenni kívánt mezőket tartalmazó új névvel ellátott típus megadása helyett adja meg a Select záradékban szereplő mezőket, és a fordító létrehoz egy névtelen típust, amelynek tulajdonságai ezek a mezők. További információ: Névtelen típusok.

    Az alábbi példa egy olyan lekérdezést hoz létre, amely visszaadja azoknak a szenioroknak a nevét és rangját, akiknek a tudományos rangja 1 és 10 között van, tudományos rang szerint. Ebben a példában a típusra studentQuery4 azért kell következtetni, mert a Select záradék egy névtelen típusú példányt ad vissza, a névtelen típusnak pedig nincs használható neve.

    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. Hozza létre és futtassa az alkalmazást a CTRL+F5 billentyűkombináció lenyomásával. Figyelje meg az eredményeket a konzolablakban.

További példák

Most, hogy megismerte az alapokat, az alábbi lista további példákat tartalmaz a LINQ-lekérdezések rugalmasságának és hatalmának szemléltetésére. Minden példát rövid leírás előz meg. Helyezze az egérmutatót a lekérdezés eredményváltozója fölé az egyes lekérdezések esetében a kikövetkezéses típus megtekintéséhez. Az eredmények előállításához használjon egy For Each hurkot.

' 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

További információk

Miután megismerte a lekérdezések használatának alapfogalmait, készen áll arra, hogy elolvassa az önt érdeklő LINQ-szolgáltató dokumentációját és mintáit:

Lásd még