Возможности 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 InferOn.

' 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, , SelectOrder ByTake Whileи другие.

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

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

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

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

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

См. также