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


Пошаговое руководство. Написание запросов в 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 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)