Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Имя Language-Integrated запроса (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, который имеет публичные свойства Name и Phone, а также другие свойства; инициализатор объектов можно использовать таким образом:
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
Определение запроса компилируется в код, аналогичный следующему примеру, который использует два лямбда-выражения для указания аргументов для 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
Дополнительные сведения см. в разделе Лямбда-выражения.