Wskazówki: Pisanie zapytań w Visual Basic

W tym przewodniku pokazano, jak używać funkcji języka Visual Basic do pisania wyrażeń zapytań zintegrowanych z językiem (LINQ). W przewodniku pokazano, jak tworzyć zapytania na liście obiektów uczniów, jak uruchamiać zapytania i jak je modyfikować. Zapytania obejmują kilka funkcji, w tym inicjatory obiektów, wnioskowanie typu lokalnego i typy anonimowe.

Po ukończeniu tego przewodnika możesz przejść do przykładów i dokumentacji dla wybranego dostawcy LINQ. Dostawcy LINQ obejmują LINQ to SQL, LINQ to DataSet i LINQ to XML.

Tworzenie projektu

Aby utworzyć projekt aplikacji konsoli

  1. Uruchom program Visual Studio.

  2. W menu Plik wskaż polecenie Nowy, a następnie kliknij pozycję Projekt.

  3. Na liście Zainstalowane szablony kliknij pozycję Visual Basic.

  4. Na liście typów projektów kliknij pozycję Aplikacja konsolowa. W polu Nazwa wpisz nazwę projektu, a następnie kliknij przycisk OK.

    Zostanie utworzony projekt. Domyślnie zawiera odwołanie do System.Core.dll. Ponadto lista Zaimportowane przestrzenie nazw na stronie Odwołania projekt Projektant (Visual Basic) zawiera System.Linq przestrzeń nazw.

  5. Na stronie kompilowania, Project Projektant (Visual Basic), upewnij się, że opcja wnioskowania jest ustawiona na Włączone.

Dodaj źródło danych w pamięci

Źródło danych dla zapytań w tym przewodniku to lista Student obiektów. Każdy Student obiekt zawiera imię, nazwisko, rok zajęć i rangę akademicką w treści ucznia.

Aby dodać źródło danych

  • Zdefiniuj klasę Student i utwórz listę wystąpień klasy.

    Ważne

    Kod potrzebny do zdefiniowania Student klasy i utworzenia listy używanej w przykładach przewodnika znajduje się w temacie Instrukcje: tworzenie listy elementów. Możesz skopiować go z tego miejsca i wkleić go do projektu. Nowy kod zastępuje kod, który pojawił się podczas tworzenia projektu.

Aby dodać nowego studenta do listy studentów

  • Postępuj zgodnie ze wzorcem w metodzie getStudents , aby dodać kolejne wystąpienie Student klasy do listy. Dodanie ucznia spowoduje wprowadzenie do inicjatorów obiektów. Aby uzyskać więcej informacji, zobacz Inicjatory obiektów: nazwane i anonimowe typy.

Tworzenie zapytania

Po wykonaniu zapytanie dodane w tej sekcji tworzy listę studentów, których ranga akademicka umieszcza je w pierwszej dziesiątce. Ponieważ zapytanie wybiera cały Student obiekt za każdym razem, typ wyniku zapytania to IEnumerable(Of Student). Jednak typ zapytania zwykle nie jest określony w definicjach zapytania. Zamiast tego kompilator używa wnioskowania typu lokalnego do określenia typu. Aby uzyskać więcej informacji, zobacz Wnioskowanie typu lokalnego. Zmienna zakresu zapytania , currentStudentsłuży jako odwołanie do każdego Student wystąpienia w źródle , studentszapewniając dostęp do właściwości każdego obiektu w studentsobiekcie .

Aby utworzyć proste zapytanie

  1. Znajdź miejsce w Main metodzie projektu oznaczonego w następujący sposób:

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

    Skopiuj poniższy kod i wklej go.

    Dim studentQuery = From currentStudent In students
                       Where currentStudent.Rank <= 10
                       Select currentStudent
    
  2. Umieść wskaźnik studentQuery myszy w kodzie, aby sprawdzić, czy typ przypisany przez kompilator to IEnumerable(Of Student).

Uruchom zapytanie

Zmienna studentQuery zawiera definicję zapytania, a nie wyniki uruchamiania zapytania. Typowy mechanizm uruchamiania zapytania to pętla For Each . Dostęp do każdego elementu w zwróconej sekwencji jest uzyskiwany za pośrednictwem zmiennej iteracji pętli. Aby uzyskać więcej informacji na temat wykonywania zapytań, zobacz Pisanie pierwszego zapytania LINQ.

Aby uruchomić zapytanie

  1. Dodaj następującą For Each pętlę poniżej zapytania w projekcie.

    For Each studentRecord In studentQuery
        Console.WriteLine(studentRecord.Last & ", " & studentRecord.First)
    Next
    
  2. Umieść wskaźnik myszy na zmiennej studentRecord sterującej pętli, aby zobaczyć jej typ danych. Typ studentRecord jest wnioskowany jako Student, ponieważ studentQuery zwraca kolekcję Student wystąpień.

  3. Skompiluj i uruchom aplikację, naciskając klawisze CTRL+F5. Zwróć uwagę na wyniki w oknie konsoli.

Zmodyfikuj zapytanie

Łatwiej jest skanować wyniki zapytania, jeśli są w określonej kolejności. Zwróconą sekwencję można posortować na podstawie dowolnego dostępnego pola.

Aby uporządkować wyniki

  1. Dodaj następującą Order By klauzulę między instrukcją Where a instrukcją Select zapytania. Klauzula Order By będzie porządkować wyniki alfabetycznie od A do Z, zgodnie z nazwiskiem każdego ucznia.

    Order By currentStudent.Last Ascending
    
  2. Aby zamówić według nazwiska, a następnie imię, dodaj oba pola do zapytania:

    Order By currentStudent.Last Ascending, currentStudent.First Ascending
    

    Można również określić Descending kolejność od Z do A.

  3. Skompiluj i uruchom aplikację, naciskając klawisze CTRL+F5. Zwróć uwagę na wyniki w oknie konsoli.

Aby wprowadzić identyfikator lokalny

  1. Dodaj kod w tej sekcji, aby wprowadzić identyfikator lokalny w wyrażeniu zapytania. Identyfikator lokalny będzie zawierać wynik pośredni. W poniższym przykładzie name jest to identyfikator, który zawiera łączenie imienia i nazwiska ucznia. Identyfikator lokalny może być używany dla wygody lub może zwiększyć wydajność, przechowując wyniki wyrażenia, które w przeciwnym razie byłyby obliczane wiele razy.

    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. Skompiluj i uruchom aplikację, naciskając klawisze CTRL+F5. Zwróć uwagę na wyniki w oknie konsoli.

Aby zaprojektować jedno pole w klauzuli Wybierz

  1. Dodaj zapytanie i For Each pętlę z tej sekcji, aby utworzyć zapytanie tworzące sekwencję, której elementy różnią się od elementów w źródle. W poniższym przykładzie źródło jest kolekcją Student obiektów, ale zwracany jest tylko jeden element członkowski każdego obiektu: imię uczniów, których nazwisko to Garcia. Ponieważ currentStudent.First jest ciągiem, typ danych sekwencji zwracanej przez studentQuery3IEnumerable(Of String)to , sekwencja ciągów. Podobnie jak we wcześniejszych przykładach, przypisanie typu danych dla studentQuery3 elementu jest pozostawione dla kompilatora w celu określenia przy użyciu wnioskowania typu lokalnego.

    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. Umieść wskaźnik studentQuery3 myszy w kodzie, aby sprawdzić, czy przypisany typ to IEnumerable(Of String).

  3. Skompiluj i uruchom aplikację, naciskając klawisze CTRL+F5. Zwróć uwagę na wyniki w oknie konsoli.

Aby utworzyć typ anonimowy w klauzuli Wybierz

  1. Dodaj kod z tej sekcji, aby zobaczyć, jak typy anonimowe są używane w zapytaniach. Są one używane w zapytaniach, gdy chcesz zwrócić kilka pól ze źródła danych, a nie pełne rekordy (rekordy w poprzednich przykładach) lub pojedyncze pola (currentStudentFirstw poprzedniej sekcji). Zamiast definiować nowy nazwany typ zawierający pola, które mają zostać uwzględnione w wyniku, należy określić pola w Select klauzuli, a kompilator tworzy typ anonimowy z tymi polami jako jego właściwości. Aby uzyskać więcej informacji, zobacz Typy anonimowe.

    Poniższy przykład tworzy zapytanie, które zwraca nazwę i rangę seniorów, których ranga akademicka wynosi od 1 do 10 w kolejności od 1 do 10. W tym przykładzie typ studentQuery4 musi być wywnioskowany, ponieważ Select klauzula zwraca wystąpienie typu anonimowego, a typ anonimowy nie ma użytecznej nazwy.

    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. Skompiluj i uruchom aplikację, naciskając klawisze CTRL+F5. Zwróć uwagę na wyniki w oknie konsoli.

Dodatkowe przykłady

Teraz, gdy znasz już podstawy, poniżej przedstawiono listę dodatkowych przykładów ilustrujących elastyczność i możliwości zapytań LINQ. Każdy przykład jest poprzedzony krótkim opisem tego, co robi. Umieść wskaźnik myszy nad zmienną wynikową zapytania dla każdego zapytania, aby zobaczyć wnioskowany typ. For Each Użyj pętli, aby wygenerować wyniki.

' 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

Dodatkowe informacje

Po zapoznaniu się z podstawowymi pojęciami dotyczącymi pracy z zapytaniami możesz zapoznać się z dokumentacją i przykładami dla określonego typu dostawcy LINQ, który cię interesuje:

Zobacz też