Основные операции запроса (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разделе "Группа по предложению".

См. также