Возможности Visual Basic, поддерживающие LINQ
Имя языкового встроенного запроса (LINQ) ссылается на технологию в Visual Basic, которая поддерживает синтаксис запросов и другие конструкции языка непосредственно на языке. При использовании LINQ вам не нужно изучать новый язык для запроса к внешнему источнику данных. Вы можете запрашивать данные в реляционных базах данных, хранилищах XML или объектах с помощью Visual Basic. Эта интеграция возможностей запросов с языком позволяет проверка времени компиляции для синтаксической ошибки и безопасности типов. Эта интеграция также гарантирует, что вы уже знаете большую часть того, что необходимо знать, чтобы писать богатые, разнообразные запросы в 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
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
public Name
и Phone
properties, а также другие свойства, инициализатор объектов можно использовать таким образом:
Dim aCust = 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()
Дополнительные сведения см. в статье Методы расширения.
Лямбда-выражения
Лямбда-выражение — это функция без имени, вычисляющего и возвращающего одно значение. В отличие от именованных функций, лямбда-выражение можно определять и выполнять одновременно. В следующем примере отображается 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
Дополнительные сведения см. в разделе Лямбда-выражения.