Основные операции запроса (Visual Basic)
В этом разделе содержится краткое введение в выражения запросов с поддержкой языка (LINQ) в Visual Basic, а также некоторые типичные операции, выполняемые в запросе. Дополнительные сведения см. в следующих разделах:
Знакомство с LINQ в Visual Basic
Пошаговое руководство. Написание запросов в Visual Basic
Указание источника данных (из)
В запросе LINQ сначала необходимо указать источник данных, который требуется запросить. From
Поэтому предложение в запросе всегда приходит в первую очередь. Операторы запросов выбирают и формируют результат на основе типа источника.
Dim query = From cust In customers
' ...
Предложение From
указывает источник данных, customers
а также переменнуюcust
диапазона. Переменная диапазона похожа на переменную итерации цикла, за исключением того, что в выражении запроса фактические итерации не выполняются. При выполнении запроса часто с помощью For Each
цикла переменная диапазона служит ссылкой на каждый последовательный элемент.customers
Так как компилятор может определить тип cust
, нет необходимости указывать его в явном виде. Примеры запросов, написанных с явным вводом, см. в разделе "Связи типов" в операциях запросов (Visual Basic).
Дополнительные сведения об использовании From
предложения в Visual Basic см. в разделе From Clause.
Фильтрация данных (где)
Вероятно, наиболее распространенная операция запроса применяет фильтр в виде логического выражения. Затем запрос возвращает только те элементы, для которых выражение имеет значение true. Предложение Where
используется для фильтрации. Фильтр указывает, какие элементы в источнике данных следует включить в результирующую последовательность. В следующем примере включены только те клиенты, у которых есть адрес в Лондоне.
Dim londonCusts = From cust In customers
Where cust.City = "London"
' ...
Логические операторы можно использовать, например And
, для Or
объединения выражений фильтров в предложении Where
. Например, чтобы вернуть только тех клиентов, которые находятся из Лондона и чье имя Devon, используйте следующий код:
Where cust.City = "London" And cust.Name = "Devon"
Чтобы вернуть клиентов из Лондона или Парижа, используйте следующий код:
Where cust.City = "London" Or cust.City = "Paris"
Дополнительные сведения об использовании Where
предложения в Visual Basic см. в разделе "Где".
Упорядочение данных (по заказу)
Часто удобно сортировать возвращаемые данные в определенном порядке. Предложение Order By
приведет к сортировке элементов в возвращаемой последовательности по указанному полю или полям. Например, следующий запрос сортирует результаты на Name
основе свойства. Так как Name
это строка, возвращаемые данные будут отсортированы в алфавитном порядке от A до Z.
Dim londonCusts1 = From cust In customers
Where cust.City = "London"
Order By cust.Name Ascending
' ...
Для упорядочения результатов в обратном порядке от Я до А используется предложение Order By...Descending
. Значение по умолчанию не указано Ascending
ни в том случае, если он Descending
не Ascending
указан.
Дополнительные сведения об использовании Order By
предложения в Visual Basic см. в разделе "Порядок по предложению".
Выбор данных (выбор)
Предложение Select
задает форму и содержимое возвращаемых элементов. Например, можно указать, будут ли результаты состоять из полных Customer
объектов, только одного Customer
свойства, подмножества свойств, сочетания свойств из различных источников данных или нового типа результатов на основе вычисления. Когда предложение Select
создает что-либо отличное от копии исходного элемента, операция называется проекцией.
Чтобы получить коллекцию, состоящую из полных Customer
объектов, выберите саму переменную диапазона:
Dim londonCusts2 = From cust In customers
Where cust.City = "London"
Order By cust.Name Ascending
Select cust
Customer
Если экземпляр является большим объектом с большим количеством полей, и все, что требуется получить, — это имя, можно выбратьcust.Name
, как показано в следующем примере. Вывод локального Customer
типа распознает, что это изменяет тип результата из коллекции объектов в коллекцию строк.
Dim londonCusts3 = From cust In customers
Where cust.City = "London"
Order By cust.Name Ascending
Select cust.Name
Чтобы выбрать несколько полей из источника данных, у вас есть два варианта:
В предложении
Select
укажите поля, которые необходимо включить в результат. Компилятор определяет анонимный тип, имеющий эти поля в качестве его свойств. Дополнительные сведения см. в статье Анонимные типы.Так как возвращаемые элементы в следующем примере являются экземплярами анонимного типа, вы не можете ссылаться на тип по имени в другом месте кода. Имя, назначенное компилятором для типа, содержит символы, недопустимые в обычном коде Visual Basic. В следующем примере элементы коллекции, возвращаемой запросом
londonCusts4
, являются экземплярами анонимного типа.Dim londonCusts4 = From cust In customers Where cust.City = "London" Order By cust.Name Ascending Select Name = cust.Name, Phone = cust.Phone For Each londonCust In londonCusts4 Console.WriteLine(londonCust.Name & " " & londonCust.Phone) Next
–или–
Определите именованный тип, содержащий определенные поля, которые необходимо включить в результат, и создайте и инициализировать экземпляры типа в предложении
Select
. Используйте этот параметр, только если необходимо использовать отдельные результаты за пределами коллекции, в которой они возвращаются, или если необходимо передать их в качестве параметров в вызовах методов. ТипlondonCusts5
в следующем примере — IEnumerable(Of Name Телефон).Public Class NamePhone Public Name As String Public Phone As String ' Additional class elements End Class
Dim londonCusts5 = From cust In customers Where cust.City = "London" Order By cust.Name Ascending Select New NamePhone With {.Name = cust.Name, .Phone = cust.Phone}
Дополнительные сведения об использовании Select
предложения в Visual Basic см. в разделе "Выбор предложения".
Присоединение к данным (присоединение к группе и присоединение к группе)
В предложении From
можно объединить несколько источников данных несколькими способами. Например, следующий код использует два источника данных и неявно объединяет свойства из обоих из них в результате. Запрос выбирает учащихся, фамилии которых начинаются с гласной.
Dim vowels() As String = {"A", "E", "I", "O", "U"}
Dim vowelNames = From student In students, vowel In vowels
Where student.Last.IndexOf(vowel) = 0
Select Name = student.First & " " &
student.Last, Initial = vowel
Order By Initial
For Each vName In vowelNames
Console.WriteLine(vName.Initial & ": " & vName.Name)
Next
Примечание.
Этот код можно запустить с помощью списка учащихся, созданных в разделе "Практическое руководство. Создание списка элементов".
Ключевое слово Join
эквивалентен INNER JOIN
sql. Он объединяет две коллекции на основе сопоставления ключевых значений между элементами в двух коллекциях. Запрос возвращает все или часть элементов коллекции с соответствующими значениями ключей. Например, следующий код дублирует действие предыдущего неявного соединения.
Dim vowelNames2 = From student In students
Join vowel In vowels
On student.Last(0) Equals vowel
Select Name = student.First & " " &
student.Last, Initial = vowel
Order By Initial
Group Join
объединяет коллекции в одну иерархическую коллекцию так же, как LEFT JOIN
и в SQL. Дополнительные сведения см. в предложении Join и предложении "Объединение групп".
Группирование данных (группирование по)
Можно добавить Group By
предложение для группировки элементов в результатах запроса в соответствии с одним или несколькими полями элементов. Например, следующий код группит учащихся по годам класса.
Dim studentsByYear = From student In students
Select student
Group By year = student.Year
Into Classes = Group
For Each yearGroup In studentsByYear
Console.WriteLine(vbCrLf & "Year: " & yearGroup.year)
For Each student In yearGroup.Classes
Console.WriteLine(" " & student.Last & ", " & student.First)
Next
Next
Если вы запускаете этот код с помощью списка учащихся, созданных в разделе "Практическое руководство. Создание списка элементов", выходные данные из инструкции For Each
:
Год: Младший
Такер, Майкл
Гарсия, Хьюго
Garcia, Debra
Тукер, Лэнс
Год: Старший
Омельченко, Светлана
Осада, Мичико
Фахури, Фади
Фэн, Ханьинг
Адамс, Терри
Год: Freshman
Мортенсен, Свен
Гарсия, Сезар
Вариант, показанный в следующем коде, заказывает годы класса, а затем заказывает учащихся в течение каждого года по фамилии.
Dim studentsByYear2 = From student In students
Select student
Order By student.Year, student.Last
Group By year = student.Year
Into Classes = Group
Дополнительные сведения см. в Group By
разделе "Группа по предложению".