Возможности 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).
См. также
Ссылки
Основные понятия
Возможности C#, поддерживающие LINQ