Основные операции запроса (Visual Basic)
Обновлен: Ноябрь 2007
Этот раздел содержит краткое описание выражений LINQ (Language-Integrated Query) Visual Basic и некоторых типичных операций, выполняемых в запросе. Дополнительные сведения см. в следующих разделах:
Знакомство с LINQ в Visual Basic
Указание источника данных (From)
В первую очередь в запросе LINQ нужно указать источник данных, к которому выполняется запрос. Поэтому предложение From всегда идет первым в запросе. Операторы запросов производят выборку и формирование результатов в зависимости от типа источника.
Dim query = From cust In customers _
' ...
Предложение From указывает источник данных customers и переменную диапазонаcust. Переменная диапазона похожа на переменную итерации цикла, за исключением того, что в выражении запроса фактической итерации не происходит. При выполнении запроса, обычно при помощи цикла For Each, переменная диапазона используется как ссылка на каждый последующий элемент в customers. Поскольку компилятор может определить тип cust, нет необходимости указывать его в явном виде. Примеры запросов, написанные с явным типизированием и без него, содержатся в разделе Отношения типов в операциях запроса (Visual Basic).
Дополнительные сведения об использовании предложения From в Visual Basic см. в разделе Условие From (Visual Basic).
Фильтрация данных (Where)
Возможно, наиболее распространенной операцией запроса является применение фильтра в виде логического выражения. Запрос в этом случае возвращает только те элементы, для которых выражение верно. Для выполнения фильтрации используется предложение Where. Фильтр определяет, какие элементы из источника данных необходимо включить в результирующую последовательность. В следующем примере будут выбраны только заказчики, находящиеся в Лондоне.
Dim londonCusts = From cust In customers _
Where cust.City = "London" _
' ...
Для объединения выражений фильтра в предложении Where можно использовать логические операторы, такие как And и Or. Например, для получения только заказчиков из Лондона с именем Devon используется следующий код:
Where cust.City = "London" And cust.Name = "Devon" _
Для возвращения заказчиков из Лондона или Парижа используется следующий код.
Where cust.City = "London" Or cust.City = "Paris" _
Дополнительные сведения об использовании предложения Where в Visual Basic см. в разделе Предложение Where (Visual Basic).
Упорядочение данных (Order By)
Часто бывает удобно упорядочить возвращенные данные в определенном порядке. Предложение Order By сортирует элементы возвращаемой последовательности по одному или по нескольким полям. Например, следующий запрос сортирует результаты на основе свойства Name. Поскольку Name является строкой, возвращаемые данные будут отсортированы в алфавитном порядке от А до Я.
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 см. в разделе Предложение Order By (Visual Basic).
Выборка данных (Select)
Предложение 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 NamePhone).
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 см. в разделе Предложение Select (Visual Basic).
Соединение данных (Join и Group Join)
В предложении 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 (Visual Basic) и Предложение Group Join (Visual Basic).
Группировка данных (Group By)
Можно добавить предложение 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 будет следующее:
Третий год обучения
Куликов, Евгений
Орехов, Алексей
Орехова, Надежда
Гладких, Андрей
Четвертый год обучения
Омельченко, Светлана
Долгопятова, Зоя
Грачев, Николай
Ожогина, Инна
Шабалин, Александр
Первый год обучения
Голдин, Максим
Орехов, Владимир
Вариант, показанный в следующем коде, упорядочивает годы обучения, а затем — студентов каждого курса по фамилиям.
Dim studentsByYear2 = From student In students _
Select student _
Order By student.Year, student.Last _
Group By year = student.Year _
Into Classes = Group
Дополнительные сведения о Group By см. в разделе Предложение Group By (Visual Basic).
См. также
Задачи
Примеры запросов (Visual Basic)
Основные понятия
Общие сведения о стандартных операторах запроса