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
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, customers
i 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 Ascending
Descending
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 anonimowegoDim 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 wlondonCusts5
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 By
programu , zobacz Group By Clause (Klauzula Grupuj według).