Пошаговое руководство. Написание запросов в Visual Basic
В этом пошаговом руководстве показано, как использовать функции языка Visual Basic для записи выражений запросов, интегрированных с языком (LINQ). В пошаговом руководстве показано, как создавать запросы в списке объектов student, как выполнять запросы и как их изменять. Запросы включают несколько функций, включая инициализаторы объектов, вывод локальных типов и анонимные типы.
После выполнения этого пошагового руководства вы будете готовы перейти к примерам и документации для конкретного поставщика LINQ, который вас интересует. Поставщики LINQ включают LINQ to SQL, LINQ to DataSet и LINQ to XML.
Создание проекта
Создание проекта консольного приложения
Запустите среду Visual Studio.
В меню Файл укажите Создать, затем нажмите Проект.
В списке установленных шаблонов щелкните Visual Basic.
В списке типов проектов щелкните консольное приложение. В поле "Имя" введите имя проекта и нажмите кнопку "ОК".
Проект создается. По умолчанию он содержит ссылку на System.Core.dll. Кроме того, список импортированных пространств имен на странице ссылок, конструктор проектов (Visual Basic) включает System.Linq пространство имен.
На странице компиляции конструктор проектов (Visual Basic) убедитесь, что параметр имеет значение On.
Добавление источника данных в памяти
Источник данных для запросов в этом пошаговом руководстве — это список Student
объектов. Каждый Student
объект содержит имя, фамилию, год класса и академический рейтинг в теле учащегося.
Добавление источника данных
Определите
Student
класс и создайте список экземпляров класса.Внимание
Код, необходимый для определения
Student
класса и создания списка, используемого в примерах пошагового руководства, представлен в разделе "Практическое руководство. Создание списка элементов". Его можно скопировать и вставить в проект. Новый код заменяет код, который появился при создании проекта.
Добавление нового учащегося в список учащихся
- Следуйте шаблону в методе
getStudents
, чтобы добавить в список другой экземплярStudent
класса. Добавление учащегося познакомит вас с инициализаторами объектов. Дополнительные сведения см. в разделе "Инициализаторы объектов: именованные и анонимные типы".
Создание запроса
При выполнении запрос, добавленный в этом разделе, создает список студентов, чьи академические ранги помещают их в первую десять. Так как запрос выбирает полный Student
объект каждый раз, тип результата запроса .IEnumerable(Of Student)
Однако тип запроса обычно не указан в определениях запросов. Вместо этого компилятор использует вывод локального типа для определения типа. Дополнительные сведения см. в разделе "Вывод локальных типов". Переменная currentStudent
диапазона запроса служит ссылкой на каждый Student
экземпляр в источнике, students
предоставляя доступ к свойствам каждого объекта в students
.
Создание простого запроса
Найдите место в
Main
методе проекта, помеченного следующим образом:' ****Paste query and query execution code from the walkthrough, ' ****or any code of your own, here in Main.
Скопируйте следующий код и вставьте его.
Dim studentQuery = From currentStudent In students Where currentStudent.Rank <= 10 Select currentStudent
Наведите указатель
studentQuery
мыши на код, чтобы убедитьсяIEnumerable(Of Student)
, что назначаемый компилятором тип.
Выполнение запроса
Переменная studentQuery
содержит определение запроса, а не результаты выполнения запроса. Типичный механизм выполнения запроса — это For Each
цикл. Доступ к каждому элементу в возвращаемой последовательности осуществляется через переменную итерации цикла. Дополнительные сведения о выполнении запросов см. в статье "Написание первого запроса LINQ".
Выполнение запроса
Добавьте следующий
For Each
цикл под запросом в проекте.For Each studentRecord In studentQuery Console.WriteLine(studentRecord.Last & ", " & studentRecord.First) Next
Наведите указатель мыши на переменную
studentRecord
элемента управления циклом, чтобы просмотреть его тип данных. Тип выводимогоstudentRecord
Student
типа, так какstudentQuery
возвращает коллекцию экземпляровStudent
.Создайте и запустите приложение, нажав клавиши CTRL+F5. Запишите результаты в окне консоли.
Изменение запроса
Проще сканировать результаты запросов, если они находятся в указанном порядке. Возвращаемую последовательность можно сортировать на основе любого доступного поля.
Упорядочение результатов
Добавьте следующее
Order By
предложение между операторомWhere
иSelect
оператором запроса. ПредложениеOrder By
упорядочит результаты в алфавитном порядке от A до Z в соответствии с фамилией каждого учащегося.Order By currentStudent.Last Ascending
Чтобы упорядочить фамилию, а затем имя, добавьте оба поля в запрос:
Order By currentStudent.Last Ascending, currentStudent.First Ascending
Вы также можете указать
Descending
порядок от Z до A.Создайте и запустите приложение, нажав клавиши CTRL+F5. Запишите результаты в окне консоли.
Введение локального идентификатора
Добавьте код в этом разделе, чтобы ввести локальный идентификатор в выражении запроса. Локальный идентификатор будет содержать промежуточный результат. В следующем примере — это идентификатор,
name
содержащий объединение первых и фамилий учащегося. Локальный идентификатор можно использовать для удобства или повысить производительность, сохраняя результаты выражения, которое в противном случае вычисляется несколько раз.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
Создайте и запустите приложение, нажав клавиши CTRL+F5. Запишите результаты в окне консоли.
Проект одного поля в предложении Select
Добавьте запрос и
For Each
цикл из этого раздела, чтобы создать запрос, который создает последовательность, элементы которой отличаются от элементов в источнике. В следующем примере источник представляет собой коллекциюStudent
объектов, но возвращается только один член каждого объекта: первое имя учащихся, фамилия которого — Garcia. ПосколькуcurrentStudent.First
это строка, тип данных последовательности, возвращаемойstudentQuery3
последовательностью строк, являетсяIEnumerable(Of String)
последовательностью строк. Как и в предыдущих примерах, назначение типа данных дляstudentQuery3
компилятора осталось для определения с помощью определения локального типа.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
Наведите указатель
studentQuery3
мыши на код, чтобы убедитьсяIEnumerable(Of String)
, что назначен тип.Создайте и запустите приложение, нажав клавиши CTRL+F5. Запишите результаты в окне консоли.
Создание анонимного типа в предложении Select
Добавьте код из этого раздела, чтобы узнать, как анонимные типы используются в запросах. Они используются в запросах, когда вы хотите вернуть несколько полей из источника данных, а не завершить записи (
currentStudent
записи в предыдущих примерах) или отдельные поля (First
в предыдущем разделе). Вместо определения нового именованного типа, содержащего поля, которые необходимо включить в результат, вы указываете поля вSelect
предложении, а компилятор создает анонимный тип с этими полями в качестве его свойств. Дополнительные сведения см. в статье Анонимные типы.В следующем примере создается запрос, который возвращает имя и ранг старших, академический рейтинг которого составляет от 1 до 10, в порядке академического ранга. В этом примере тип
studentQuery4
должен быть выведен, так какSelect
предложение возвращает экземпляр анонимного типа, а анонимный тип не имеет допустимого имени.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
Создайте и запустите приложение, нажав клавиши CTRL+F5. Запишите результаты в окне консоли.
Дополнительные примеры
Теперь, когда вы понимаете основы, ниже приведен список дополнительных примеров для иллюстрации гибкости и возможностей запросов LINQ. Перед каждым примером предшествует краткое описание того, что он делает. Наведите указатель мыши на переменную результата запроса для каждого запроса, чтобы увидеть выводимый тип. For Each
Используйте цикл для получения результатов.
' 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
Дополнительная информация
После ознакомления с основными понятиями работы с запросами вы можете ознакомиться с документацией и примерами для конкретного типа поставщика LINQ, который вы хотите: