Udostępnij za pośrednictwem


Podstawowe operacje zapytań (Visual Basic)

Ten temat zawiera krótkie wprowadzenie do wyrażeń zapytań zintegrowanych z językiem (LINQ) w Visual Basic oraz do niektórych typowych rodzajów operacji wykonywanych w zapytaniu. Aby uzyskać więcej informacji, zobacz następujące tematy:

Wprowadzenie do LINQ w Visual Basic

Zapytania

Przewodnik: pisanie zapytań w Visual Basic

Określanie źródła danych (z)

W zapytaniu LINQ pierwszym krokiem jest określenie źródła danych, którego chcesz wykonać zapytanie. Dlatego klauzula From w zapytaniu zawsze pojawia się jako pierwsza. Operatory zapytań wybierają i kształtją wynik na podstawie typu źródła.

Dim query = From cust In customers
'           ...

Klauzula From określa źródło danych, customersi zmienną zakresu . cust Zmienna zakresu jest jak zmienna iteracji pętli, z tą różnicą, że w wyrażeniu zapytania nie ma rzeczywistej iteracji. Gdy zapytanie jest wykonywane, często przy użyciu For Each pętli, zmienna zakresu służy jako odwołanie do każdego kolejnego elementu w elemencie customers. Ponieważ kompilator może wywnioskować typ cust, nie trzeba jawnie go określać. Aby zapoznać się z przykładami zapytań napisanych za pomocą jawnego wpisywania i bez jawnego pisania, zobacz Relacje typów w operacjach zapytań (Visual Basic).

Aby uzyskać więcej informacji na temat używania klauzuli From w Visual Basic, zobacz Klauzula From.

Filtrowanie danych (gdzie)

Prawdopodobnie najczęstszą operacją zapytania jest zastosowanie filtru w postaci wyrażenia logicznego. Następnie zapytanie zwraca tylko te elementy, dla których wyrażenie jest prawdziwe. Klauzula jest Where używana do filtrowania. Filtr określa, które elementy w źródle danych mają być uwzględnione w wynikowej sekwencji. W poniższym przykładzie uwzględniono tylko tych klientów, którzy mają adres w Londynie.

Dim londonCusts = From cust In customers
                  Where cust.City = "London"
'                 ...

Operatory logiczne, takie jak And i Or , umożliwiają łączenie wyrażeń filtru w klauzuli Where . Aby na przykład zwrócić tylko tych klientów, którzy pochodzą z Londynu i których nazwa to Devon, użyj następującego kodu:

Where cust.City = "London" And cust.Name = "Devon"

Aby zwrócić klientów z Londynu lub Paryża, użyj następującego kodu:

Where cust.City = "London" Or cust.City = "Paris"

Aby uzyskać więcej informacji na temat używania klauzuli Where w Visual Basic, zobacz Where Klauzula.

Szeregowanie danych (porządkuj wg)

Często wygodne jest sortowanie zwracanych danych w określonej kolejności. Klauzula Order By spowoduje, że elementy w zwróconej sekwencji zostaną posortowane w określonym polu lub polach. Na przykład następujące zapytanie sortuje wyniki na Name podstawie właściwości . Ponieważ Name jest ciągiem, zwracane dane będą sortowane alfabetycznie, od A do Z.

Dim londonCusts1 = From cust In customers
                   Where cust.City = "London"
                   Order By cust.Name Ascending
'                   ...

Aby uporządkować wyniki w odwrotnej kolejności, od Z do A, użyj klauzuli Order By...Descending . Wartość domyślna jest Ascending taka, gdy ani nie AscendingDescending jest określona.

Aby uzyskać więcej informacji na temat używania klauzuli w Visual Basic, zobacz Klauzula Order By Order By.

Wybieranie danych (wybór)

Klauzula Select określa formularz i zawartość zwracanych elementów. Można na przykład określić, czy wyniki będą składać się z kompletnych Customer obiektów, tylko jednej Customer właściwości, podzestawu właściwości, kombinacji właściwości z różnych źródeł danych lub nowego typu wyników na podstawie obliczeń. Gdy klauzula Select generuje coś innego niż kopia elementu źródłowego, operacja jest nazywana projekcją.

Aby pobrać kolekcję składającą się z kompletnych Customer obiektów, wybierz samą zmienną zakresu:

Dim londonCusts2 = From cust In customers
                   Where cust.City = "London"
                   Order By cust.Name Ascending
                   Select cust

Jeśli wystąpienie jest dużym obiektem Customer , który ma wiele pól, a wszystko, co chcesz pobrać, to nazwa, możesz wybrać wartość cust.Name, jak pokazano w poniższym przykładzie. Wnioskowanie typu lokalnego rozpoznaje, że spowoduje to zmianę typu wyniku z kolekcji obiektów na kolekcję Customer ciągów.

Dim londonCusts3 = From cust In customers
                   Where cust.City = "London"
                   Order By cust.Name Ascending
                   Select cust.Name

Aby wybrać wiele pól ze źródła danych, dostępne są dwie opcje:

  • W klauzuli Select określ pola, które mają zostać uwzględnione w wyniku. Kompilator zdefiniuje typ anonimowy zawierający te pola jako jego właściwości. Aby uzyskać więcej informacji, zobacz Typy anonimowe.

    Ponieważ zwracane elementy w poniższym przykładzie są wystąpieniami typu anonimowego, nie można odwoływać się do typu według nazwy w innym miejscu w kodzie. Nazwa wyznaczona przez kompilator dla typu zawiera znaki, które nie są prawidłowe w normalnym kodzie języka Visual Basic. W poniższym przykładzie elementy w kolekcji zwracane przez zapytanie londonCusts4 są wystąpieniami typu anonimowego

    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
    

    — lub —

  • Zdefiniuj nazwany typ zawierający określone pola, które mają zostać uwzględnione w wyniku, oraz utwórz i zainicjuj wystąpienia typu w klauzuli Select . Użyj tej opcji tylko wtedy, gdy musisz użyć pojedynczych wyników poza kolekcją, w której są zwracane, lub jeśli musisz przekazać je jako parametry w wywołaniach metody. Typ w londonCusts5 poniższym przykładzie to IEnumerable(Of Name Telefon).

    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}
    

Aby uzyskać więcej informacji na temat używania klauzuli Select w Visual Basic, zobacz Select Clause (Wybieranie klauzuli).

Przyłączanie danych (łączenie i łączenie grupy)

W klauzuli From można połączyć więcej niż jedno źródło danych na kilka sposobów. Na przykład poniższy kod używa dwóch źródeł danych i niejawnie łączy właściwości z obu tych źródeł w wyniku. Zapytanie wybiera uczniów, których nazwiska zaczynają się od samogłosek.

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

Uwaga

Możesz uruchomić ten kod z listą uczniów utworzonych w temacie Jak utworzyć listę elementów.

Słowo Join kluczowe jest równoważne elementowi INNER JOIN w języku SQL. Łączy dwie kolekcje oparte na dopasowywaniu kluczowych wartości między elementami w dwóch kolekcjach. Zapytanie zwraca wszystkie lub część elementów kolekcji, które mają pasujące wartości klucza. Na przykład poniższy kod duplikuje akcję poprzedniego niejawnego sprzężenia.

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 łączy kolekcje w jedną hierarchiczną kolekcję, podobnie jak LEFT JOIN w języku SQL. Aby uzyskać więcej informacji, zobacz Join Clause and Group Join Clause (Klauzula join i klauzula dołączania do grupy).

Grupowanie danych (grupuj według)

Klauzulę Group By można dodać, aby zgrupować elementy w wyniku zapytania zgodnie z co najmniej jednym polem elementów. Na przykład następujące kody grupuje uczniów według roku zajęć.

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

Jeśli uruchomisz ten kod przy użyciu listy uczniów utworzonych w temacie Jak utworzyć listę elementów, dane wyjściowe z instrukcji For Each to:

Rok: Junior

Tucker, Michael

Garcia, Hugo

Garcia, Debra

Tucker, Lance

Rok: Starszy

Omelchenko, Svetlana

Osada, Michiko

Fakhouri, Fadi

Feng, Hanying

Adams, Terry

Rok: Freshman

Mortensen, Sven

Garcia, Cesar

Odmiana pokazana w poniższym kodzie porządkuje lata zajęć, a następnie zamawia uczniów w ciągu każdego roku według nazwiska.

Dim studentsByYear2 = From student In students
                      Select student
                      Order By student.Year, student.Last
                      Group By year = student.Year
                      Into Classes = Group

Aby uzyskać więcej informacji na temat Group Byprogramu , zobacz Group By Clause (Klauzula Grupuj według).

Zobacz też