Поделиться через


Пошаговое руководство. Написание запросов в Visual Basic

В этом пошаговом руководстве показано использование возможностей Visual Basic для написания выражений запросов LINQ.Это руководство показывает процесс создания запросов к списку объектов Student, их выполнение и изменение.Запросы включают в себя несколько функций, которые были новыми в Visual Basic 2008, в том числе инициализаторы объектов, вывод локального типа и анонимные типы.

После выполнения этого пошагового руководства можно переходить к примерам и документации по конкретным интересующим вас поставщикам LINQ.К поставщикам LINQ относятся LINQ to SQL, LINQ to DataSet и LINQ to XML.

Создание проекта

Создание проекта консольного приложения

  1. Запустите Visual Studio.

  2. В меню Файл последовательно выберите пункты Создать и Проект.

  3. В списке Установленные шаблоны щелкните Visual Basic.

  4. В списке типов проекта выберите Консольное приложение.В поле Имя введите имя проекта и нажмите кнопку ОК.

    Проект создан.По умолчанию он содержит ссылку на System.Core.dll.Кроме того, список Импортируемые пространства имен в Страница "Ссылки" в конструкторе проектов (Visual Basic) включает пространство имен System.Linq.

  5. На Страница "Компиляция" в конструкторе проектов (Visual Basic), убедитесь, что Option infer имеет значение На.

Добавление находящегося в памяти источника данных

Источником данных для запросов в этом руководстве является список объектов Student.Каждый объект Student содержит имя, фамилию, год обучения и академическую успеваемость.

Добавление источника данных

  • Определите класс Student и создайте список экземпляров класса.

    Важное примечаниеВажно

    Код, необходимый для определения класса Student и создания списка, используемого в примерах, приведен в разделе Практическое руководство. Создание списка элементов.Можно скопировать его оттуда и вставить в проект.Новый код заменяет код, появившийся при создании проекта.

Добавление нового студента в список студентов

Создание запроса

При выполнении созданного в этом разделе запроса выводится список студентов, успеваемость которых попадает в десятку лучших.Поскольку запрос каждый раз выбирает завершенные объекты Student, типом результата запроса является IEnumerable(Of Student).Однако в определениях запроса тип запроса обычно не указывается.Вместо этого компилятор использует локальное определение типа.Дополнительные сведения см. в разделе Вывод локального типа (Visual Basic).Переменная диапазона запроса, currentStudent, служит в качестве ссылки на каждый экземпляр Student в источнике students, предоставляя доступ к свойствам каждого объекта в students.

Создание простого запроса

  1. Найдите в методе 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
    
  2. Наведите указатель мыши на studentQuery в коде, чтобы проверить, что компилятор назначил тип IEnumerable(Of Student).

Выполнение запроса

Переменная studentQuery содержит определение запроса, а не результаты выполнения запроса.Типичным механизмом выполнения запроса является цикл For Each.Доступ к каждому элементу в возвращаемой последовательности осуществляется с помощью переменной итерации цикла.Дополнительные сведения о выполнении запроса см. в разделе Написание первого запроса LINQ (Visual Basic).

Выполнение запроса

  1. Добавьте следующий цикл For Each под запросом в проекте.

    For Each studentRecord In studentQuery
        Console.WriteLine(studentRecord.Last & ", " & studentRecord.First)
    Next
    
  2. Наведите указатель мыши на переменную цикла studentRecord для просмотра ее типа данных.Тип studentRecord определен как Student, поскольку studentQuery возвращает коллекцию экземпляров Student.

  3. Постройте и запустите приложение, нажав сочетание клавиш CTRL + F5.Обратите внимание на результаты в окне консоли.

Изменение запроса

Результаты запроса легче просматривать, если они упорядочены.Возвращаемую последовательность можно отсортировать по любому доступному полю.

Упорядочение результатов

  1. Добавьте следующее предложение Order By между операторами Where и Select в запросе.Предложение Order By будет упорядочивать результаты в алфавитном порядке от А до Я по фамилиям студентов.

    Order By currentStudent.Last Ascending 
    
  2. Чтобы упорядочить сначала по фамилии, а затем по имени, добавьте в запрос оба поля.

    Order By currentStudent.Last Ascending, currentStudent.First Ascending 
    

    Чтобы упорядочить от Я до А, можно также указать Descending.

  3. Постройте и запустите приложение, нажав сочетание клавиш CTRL + F5.Обратите внимание на результаты в окне консоли.

Ввод локального идентификатора

  1. Чтобы ввести локальный идентификатор в выражение запроса, добавьте код в данном разделе.Локальный идентификатор будет содержать промежуточные результаты.В следующем примере 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
    
  2. Постройте и запустите приложение, нажав сочетание клавиш CTRL + F5.Обратите внимание на результаты в окне консоли.

Проецирование одного поля в предложении Select

  1. Добавьте запрос и цикл 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
    
  2. Наведите указатель мыши на studentQuery3 в коде, чтобы проверить, что компилятор назначил тип IEnumerable(Of String).

  3. Постройте и запустите приложение, нажав сочетание клавиш CTRL + F5.Обратите внимание на результаты в окне консоли.

Создание анонимного типа в предложении Select

  1. Добавьте код из этого раздела, чтобы просмотреть использование анонимных типов в запросах.Их можно использовать в запросах при необходимости возвращать несколько полей из источника данных, вместо полных записей (записи 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
    
  2. Постройте и запустите приложение, нажав сочетание клавиш 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.

LINQ to Objects

LINQ to SQL

LINQ to XML

LINQ to DataSet

См. также

Задачи

Пошаговое руководство. Написание запросов на C# (LINQ)

Основные понятия

Дополнительные ресурсы по LINQ

Вывод локального типа (Visual Basic)

Инициализаторы объектов: именованные и анонимные типы (Visual Basic)

Анонимные типы (Visual Basic)

Знакомство с LINQ в Visual Basic

Другие ресурсы

LINQ

Приступая к работе с LINQ в Visual Basic

LINQ в Visual Basic

Запросы (Visual Basic)