Пошаговое руководство. Написание запросов в Visual Basic
В этом пошаговом руководстве показано использование возможностей Visual Basic для написания выражений запросов LINQ. Это руководство показывает процесс создания запросов к списку объектов Student, их выполнение и изменение. Запросы включают в себя несколько функций, которые были новыми в Visual Basic 2008, в том числе инициализаторы объектов, вывод локального типа и анонимные типы.
После выполнения этого пошагового руководства можно переходить к примерам и документации по конкретным интересующим вас поставщикам LINQ. К поставщикам LINQ относятся LINQ to SQL, LINQ to DataSet и LINQ to XML.
Создание проекта
Создание проекта консольного приложения
Запустите Visual Studio.
В меню Файл последовательно выберите пункты Создать и Проект.
В списке Установленные шаблоны щелкните Visual Basic.
В списке типов проекта выберите Консольное приложение. В поле Имя введите имя проекта и нажмите кнопку ОК.
Проект создан. По умолчанию он содержит ссылку на System.Core.dll. Кроме того, список Импортируемые пространства имен в Страница "Ссылки" в конструкторе проектов (Visual Basic) включает пространство имен System.Linq.
На Страница "Компиляция" в конструкторе проектов (Visual Basic), убедитесь, что Option infer имеет значение На.
Добавление находящегося в памяти источника данных
Источником данных для запросов в этом руководстве является список объектов Student. Каждый объект Student содержит имя, фамилию, год обучения и академическую успеваемость.
Добавление источника данных
Определите класс Student и создайте список экземпляров класса.
Важно!
Код, необходимый для определения класса Student и создания списка, используемого в примерах, приведен в разделе Практическое руководство. Создание списка элементов.Можно скопировать его оттуда и вставить в проект.Новый код заменяет код, появившийся при создании проекта.
Добавление нового студента в список студентов
- Для добавления в список другого экземпляра класса Student следуйте шаблону в методе getStudents. После добавления учащегося будут представлены инициализаторы объектов. Дополнительные сведения см. в разделе Инициализаторы объектов: именованные и анонимные типы (Visual Basic).
Создание запроса
При выполнении созданного в этом разделе запроса выводится список студентов, успеваемость которых попадает в десятку лучших. Поскольку запрос каждый раз выбирает завершенные объекты Student, типом результата запроса является IEnumerable(Of Student). Однако в определениях запроса тип запроса обычно не указывается. Вместо этого компилятор использует локальное определение типа. Дополнительные сведения см. в разделе Вывод локального типа (Visual Basic). Переменная диапазона запроса, 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 (Visual Basic).
Выполнение запроса
Добавьте следующий цикл 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 будет упорядочивать результаты в алфавитном порядке от А до Я по фамилиям студентов.
Order By currentStudent.Last Ascending
Чтобы упорядочить сначала по фамилии, а затем по имени, добавьте в запрос оба поля.
Order By currentStudent.Last Ascending, currentStudent.First Ascending
Чтобы упорядочить от Я до А, можно также указать Descending.
Постройте и запустите приложение, нажав сочетание клавиш 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, однако возвращается только один член каждого объекта: имена студентов, фамилия которых Орехов. Поскольку 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 и компилятор создает анонимный тип с этими полями как свойства. Дополнительные сведения см. в разделе Анонимные типы (Visual Basic).
В следующем примере создается запрос, возвращающий имя и успеваемость старшекурсников, чья успеваемость находится между 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.
См. также
Задачи
Пошаговое руководство. Написание запросов на C# (LINQ)
Основные понятия
Дополнительные ресурсы по LINQ
Вывод локального типа (Visual Basic)
Инициализаторы объектов: именованные и анонимные типы (Visual Basic)
Знакомство с LINQ в Visual Basic