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


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

Обновлен: Ноябрь 2007

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

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

ссылка на видео Для просмотра демонстрационных видеороликов перейдите по ссылке Видео: написание запросов в Visual Basic.

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

Создание проекта, предназначенного для платформы .NET Framework версии 3.5

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

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

  3. Выберите Консольное приложение, а затем нажмите кнопку ОК.

    Проект создан. По умолчанию он содержит ссылку на System.Core.dll и оператор Imports для пространства имен System.Linq, которые необходимы для выполнения запросов LINQ.

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

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

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

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

    Bb385164.alert_caution(ru-ru,VS.90).gifВажное примечание.

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

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

  • Для добавления в список другого экземпляра класса Student следуйте шаблону в методе getStudents. Добавление студентов представит вам инициализаторы объектов, которые являются новыми возможностями Visual Basic 2008. Дополнительные сведения см. в разделе Инициализаторы объектов: именованные и анонимные типы.

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

При выполнении созданного в этом разделе запроса выводится список студентов, успеваемость которых попадает в десятку лучших. Поскольку запрос каждый раз выбирает завершенные объекты Student, типом результата запроса является IEnumerable(Of Student). Однако в определениях запроса тип запроса обычно не указывается. Вместо этого компилятор использует локальное определение типа. Дополнительные сведения см. в разделе Вывод локального типа. Переменная диапазона запроса, 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. Добавьте код из этого раздела, чтобы просмотреть использование анонимных типов в запросах. Анонимные типы являются новой возможностью Visual Basic 2008. Их можно использовать в запросах при необходимости возвращать несколько полей из источника данных, вместо полных записей (записи 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
    
  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

См. также

Задачи

Примеры запросов (Visual Basic)

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

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

Вывод локального типа

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

Анонимные типы

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

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

LINQ

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

LINQ в Visual Basic

Запросы (Visual Basic)