Основные операции запроса (Visual Basic)

Этот раздел содержит краткое описание выражений LINQ (Language-Integrated Query) Visual Basic и некоторых типичных операций, выполняемых в запросе. Дополнительные сведения см. в следующих разделах.

Знакомство с LINQ в Visual Basic

Запросы (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).

    Поскольку возвращенные элементы в следующем примере являются экземплярами анонимного типа, невозможно сослаться на тип по имени из другого места в коде. Имя типа, установленное компилятором, содержит знаки, которые являются недопустимыми в обычном коде 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).

См. также

Ссылки

IEnumerable<T>

Основные понятия

Общие сведения о стандартных операторах запроса

Основные операции запросов LINQ (C#)

Другие ресурсы

Приступая к работе с LINQ в Visual Basic

Запросы (Visual Basic)

LINQ в Visual Basic