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


Возможности Visual Basic, поддерживающие LINQ

LINQ называют технологию в Visual Basic для поддержки синтаксиса запроса и других новых языковых конструкций непосредственно в языке.С LINQ исчезает необходимость изучать новый язык для запросов к внешним источникам данных.С помощью Visual Basic можно выполнять запросы к данным в реляционных базах данных, XML-хранилищах или объектах.Такая интеграция возможностей запроса в язык позволяет выполнять проверку синтаксических ошибок во время компиляции и строгую типизацию.Такая интеграция также гарантирует наличие у разработчика большей части знаний, необходимых ему для написания насыщенных и разнообразных запросов в Visual Basic.

В следующем разделе достаточно подробно описаны конструкции языка? поддерживающие LINQ, что позволяет начать с чтения вводной документации, изучения примеров кода и примеров приложений.Для получения более подробных пояснений по объединению средств языка для поддержки интегрированных в язык запросов воспользуйтесь ссылками.Хорошей отправной точкой служит раздел Пошаговое руководство. Написание запросов в Visual Basic.

Выражения запросов

Выражения запросов в Visual Basic могут быть выражены в декларативном синтаксисе, похожем на SQL или XQuery.При компиляции синтаксис запроса преобразуется в вызовы методов стандартных операторов запроса, реализованные поставщиком LINQ.Приложения управляют стандартными операторами запросов, находящимися в области действия, путем указания подходящего пространства имен с помощью директивы Imports.Синтаксис выражения запроса для Visual Basic выглядит следующим образом:

Dim londonCusts = From cust In customers
                  Where cust.City = "London"
                  Order By cust.Name Ascending
                  Select cust.Name, cust.Phone

Дополнительные сведения см. в разделе Знакомство с LINQ в Visual Basic.

Неявно типизированные переменные

Вместо явного указания типа при объявлении и инициализации переменной можно разрешить компилятору определить и назначить тип.Это называется локальным определением типа.

Переменные, типы которых определены, строго типизированы, так же, как и переменные с явным указанием типа.Вывод локального типа работает только при определении локальной переменной внутри тела метода.Дополнительные сведения см. в разделах Оператор Option Infer и Вывод локального типа (Visual Basic).

В следующем примере показан вывод локального типа.Для использования этого примера необходимо задать для Option Infer значение On.

' The variable aNumber will be typed as an integer.
Dim aNumber = 5

' The variable aName will be typed as a String.
Dim aName = "Virginia"

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

В следующем примере LINQ определение типа происходит, если Option Infer имеет значение On либо Off.Ошибка времени компиляции происходит, если Option Infer имеет значение Off, а Option Strict — значение On.

' Query example.
' If numbers is a one-dimensional array of integers, num will be typed
' as an integer and numQuery will be typed as IEnumerable(Of Integer)--
' basically a collection of integers.

Dim numQuery = From num In numbers
               Where num Mod 2 = 0
               Select num

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

Инициализаторы объектов используются в выражениях запроса при создании анонимного типа для хранения результатов запроса.Они также могут использоваться для инициализации объектов с именованными типами за пределами запросов.С помощью инициализатора объекта можно инициализировать объект в одной строке без явного вызова конструктора.Пусть существует класс с именем Customer, имеющий открытые свойства Name, Phone и несколько других свойств. Инициализатор объекта может использоваться следующим образом.

Dim aCust = New Customer With {.Name = "Mike",
                               .Phone = "555-0212"}

Дополнительные сведения см. в разделе Инициализаторы объектов: именованные и анонимные типы (Visual Basic).

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

Анонимные типы предоставляют удобный способ для временной группировки набора свойств в элементе для включения в результат запроса.Это позволяет выбрать любое сочетание доступных полей в запросе, в любом порядке, без определения именованных типов данных для элемента.

Анонимный тип динамически создается компилятором.Имя типа назначается компилятором и оно может изменяться при каждой новой компиляции.Поэтому имя не может использоваться непосредственно.Анонимные типы инициализируются следующим образом.

' Outside a query.
Dim product = New With {.Name = "paperclips", .Price = 1.29}

' Inside a query.
' You can use the existing member names of the selected fields, as was
' shown previously in the Query Expressions section of this topic.
Dim londonCusts1 = From cust In customers
                   Where cust.City = "London"
                   Select cust.Name, cust.Phone

' Or you can specify new names for the selected fields.
Dim londonCusts2 = From cust In customers
                   Where cust.City = "London"
                   Select CustomerName = cust.Name,
                   CustomerPhone = cust.Phone

Дополнительные сведения см. в разделе Анонимные типы (Visual Basic).

К методам расширения

Методы расширения позволяют добавить методы к типу данных или интерфейсу вне определения.Эта возможность позволяет, по сути, добавить новые методы в существующие типы без их фактического изменения.Стандартные операторы запросов являются набором методов расширения, предоставляющих функциональные возможности запроса LINQ для любого типа, который реализует IEnumerable<T>. Другие расширения IEnumerable<T> включают Count, Union и Intersect.

Следующий метод расширения добавляет метод печати в класс String.

' Import System.Runtime.CompilerServices to use the Extension attribute.
<Extension()>
    Public Sub Print(ByVal str As String)
    Console.WriteLine(str)
End Sub

Метод вызывается как обычный метод экземпляра String:

Dim greeting As String = "Hello"
greeting.Print()

Дополнительные сведения см. в разделе Методы расширения (Visual Basic).

Лямбда-выражения

Лямбда-выражение представляет собой функцию без имени для вычисления и возврата одиночного значения.В отличие от именованных функций лямбда-выражение может быть определено и выполнено одновременно.Следующий пример выводит 4.

Console.WriteLine((Function(num As Integer) num + 1)(3))

Можно присвоить определение лямбда-выражения имени переменной, а затем использовать имя для вызова функции.Следующий пример выводит 4.

Dim add1 = Function(num As Integer) num + 1
Console.WriteLine(add1(3))

В LINQ лямбда-выражения лежат в основе многих стандартных операторов запроса.Компилятор создает лямбда-выражения для записи вычислений, определенных в основных методах запроса, таких как Where, Select, Order By, Take While и других.

Например, следующий код определяет запрос для возврата всех выпускников из списка студентов.

Dim seniorsQuery = From stdnt In students
                   Where stdnt.Year = "Senior"
                   Select stdnt

Определение запроса компилируется в код, похожий на приведенный в следующем примере, в котором используются два лямбда-выражения для определения аргументов для Where и Select.

Dim seniorsQuery2 = students.
    Where(Function(st) st.Year = "Senior").
    Select(Function(s) s)

Оба варианта могут быть выполнены с помощью цикла For Each:

For Each senior In seniorsQuery
    Console.WriteLine(senior.Last & ", " & senior.First)
Next

Дополнительные сведения см. в разделе Лямбда-выражения (Visual Basic).

См. также

Ссылки

Оператор Option Infer

Оператор Option Strict

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

LINQ и строки

Возможности C#, поддерживающие LINQ

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

LINQ

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