Возможности Visual Basic, поддерживающие LINQ
LINQ (Language-Integrated Query) называют технологию в 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 number will be typed as an integer.
Dim aNumber = 5
' The variable name 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).
См. также
Ссылки
Основные понятия
Возможности C#, поддерживающие LINQ
Другие ресурсы
Приступая к работе с LINQ в Visual Basic
Журнал изменений
Дата |
Журнал |
Причина |
---|---|---|
Май 2011 |
Изменен раздел "Неявно типизированные переменные". |
Исправление ошибки содержимого. |