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
Uruchom program Visual Studio.
W menu Plik wskaż polecenie Nowy, a następnie kliknij pozycję Projekt.
Na liście Zainstalowane szablony kliknij pozycję Visual Basic.
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.
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ąpienieStudent
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 , currentStudent
służy jako odwołanie do każdego Student
wystąpienia w źródle , students
zapewniając dostęp do właściwości każdego obiektu w students
obiekcie .
Aby utworzyć proste zapytanie
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
Umieść wskaźnik
studentQuery
myszy w kodzie, aby sprawdzić, czy typ przypisany przez kompilator toIEnumerable(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
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
Umieść wskaźnik myszy na zmiennej
studentRecord
sterującej pętli, aby zobaczyć jej typ danych. TypstudentRecord
jest wnioskowany jakoStudent
, ponieważstudentQuery
zwraca kolekcjęStudent
wystąpień.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
Dodaj następującą
Order By
klauzulę między instrukcjąWhere
a instrukcjąSelect
zapytania. KlauzulaOrder By
będzie porządkować wyniki alfabetycznie od A do Z, zgodnie z nazwiskiem każdego ucznia.Order By currentStudent.Last Ascending
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.Skompiluj i uruchom aplikację, naciskając klawisze CTRL+F5. Zwróć uwagę na wyniki w oknie konsoli.
Aby wprowadzić identyfikator lokalny
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
Skompiluj i uruchom aplikację, naciskając klawisze CTRL+F5. Zwróć uwagę na wyniki w oknie konsoli.
Aby zaprojektować jedno pole w klauzuli Wybierz
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 przezstudentQuery3
IEnumerable(Of String)
to , sekwencja ciągów. Podobnie jak we wcześniejszych przykładach, przypisanie typu danych dlastudentQuery3
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
Umieść wskaźnik
studentQuery3
myszy w kodzie, aby sprawdzić, czy przypisany typ toIEnumerable(Of String)
.Skompiluj i uruchom aplikację, naciskając klawisze CTRL+F5. Zwróć uwagę na wyniki w oknie konsoli.
Aby utworzyć typ anonimowy w klauzuli Wybierz
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 (
currentStudent
First
w poprzedniej sekcji). Zamiast definiować nowy nazwany typ zawierający pola, które mają zostać uwzględnione w wyniku, należy określić pola wSelect
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
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: