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

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

После выполнения этого пошагового руководства вы будете готовы перейти к примерам и документации для конкретного поставщика 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) убедитесь, что параметр имеет значение On.

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

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

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

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

    Внимание

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

Добавление нового учащегося в список учащихся

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

При выполнении запрос, добавленный в этом разделе, создает список студентов, чьи академические ранги помещают их в первую десять. Так как запрос выбирает полный 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".

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

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

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

  3. Создайте и запустите приложение, нажав клавиши CTRL+F5. Запишите результаты в окне консоли.

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

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

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

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

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

    Order By currentStudent.Last Ascending, currentStudent.First Ascending
    

    Вы также можете указать Descending порядок от Z до A.

  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 объектов, но возвращается только один член каждого объекта: первое имя учащихся, фамилия которого — 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
    
  2. Наведите указатель studentQuery3 мыши на код, чтобы убедиться IEnumerable(Of String), что назначен тип.

  3. Создайте и запустите приложение, нажав клавиши CTRL+F5. Запишите результаты в окне консоли.

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

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

См. также