Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Ten temat zawiera krótkie wprowadzenie do wyrażeń zapytań Language-Integrated (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 języku Visual Basic
Przewodnik: pisanie zapytań w Visual Basic
Określanie źródła danych (z)
W zapytaniu w LINQ pierwszym krokiem jest określenie źródła danych, które chcesz zapytać. 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 z jawnym określeniem typu oraz bez niego, 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. Do filtrowania używa się klauzuli Where. 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, sprawdź Klauzula WHERE.
Porządkowanie danych (kolejność według)
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 podstawie właściwości Name. 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 to Ascending, gdy nie określono ani Ascending, ani Descending.
Aby uzyskać więcej informacji na temat używania klauzuli w Visual Basic, zobacz Klauzula Order ByOrder By.
Wybieranie danych (wybierz)
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 obiekt Customer jest duży i ma wiele pól, a wszystko, co chcesz pobrać, to nazwa, możesz wybrać opcję 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
Selectokreś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
londonCusts4są 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 wlondonCusts5poniższym przykładzie to IEnumerable(Of NamePhone).Public Class NamePhone Public Name As String Public Phone As String ' Additional class elements End ClassDim 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).
Dołączanie danych (łączenie i grupowanie)
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 / Notatka
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 powiela działanie 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 Klauzula łączenia oraz Klauzula łączenia grupowego.
Grupowanie danych (grupowanie 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: Student pierwszego roku
Mortensen, Sven
Garcia, Cesar
Wariant przedstawiony w poniższym kodzie porządkuje lata klasowe, a następnie sortuje uczniów w ramach 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, zobacz Klauzulę Grupuj według.