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

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

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

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

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

Выражения запросов в Visual Basic 2008 могут быть выражены в декларативном синтаксисе, похожем на 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.

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

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

Bb384991.alert_note(ru-ru,VS.90).gifПримечание.

Локальное определение типа работает только при определении локальной переменной внутри основной части метода, где параметр Option Infer, имеет значение On. Значение On используется по умолчанию для новых проектов LINQ. Дополнительные сведения см. в разделе Оператор Option Infer.

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

' The variable name will be typed as a String.
Dim aName = "Virginia"
Bb384991.alert_note(ru-ru,VS.90).gifПримечание.

В Visual Basic 2005 и более ранних версиях эти примеры компилируются, но и aNumber и aName назначается тип Object. Таким образом, существующий проект, перекомпилированный в Visual Basic 2008 с параметром Option Infer равным 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

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

Дополнительные сведения см. в разделе Вывод локального типа.

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

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

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

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

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

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

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

' 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

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

Методы расширения

Методы расширения позволяют добавить методы к типу данных или интерфейсу вне определения. Эта возможность позволяет, по сути, добавить новые методы в существующие типы без их фактического изменения. Стандартные операторы запросов являются набором методов расширения, предоставляющих функциональные возможности запроса 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)

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

LINQ и строки

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

LINQ

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