Funkcje Visual Basic obsługujące LINQ
Nazwa Zapytanie zintegrowane z językiem (LINQ) odnosi się do technologii w Visual Basic, która obsługuje składnię zapytań i inne konstrukcje języka bezpośrednio w języku. W przypadku linQ nie musisz uczyć się nowego języka do wykonywania zapytań względem zewnętrznego źródła danych. Zapytania dotyczące danych można wykonywać w relacyjnych bazach danych, magazynach XML lub obiektach przy użyciu języka Visual Basic. Ta integracja możliwości zapytań z językiem umożliwia sprawdzanie czasu kompilacji pod kątem błędów składni i bezpieczeństwa typów. Ta integracja zapewnia również, że znasz już większość tego, co musisz wiedzieć, aby pisać zaawansowane, zróżnicowane zapytania w visual basic.
W poniższych sekcjach opisano konstrukcje języka, które obsługują linQ wystarczająco szczegółowo, aby umożliwić rozpoczęcie czytania dokumentacji wprowadzającej, przykładów kodu i przykładowych aplikacji. Możesz również kliknąć linki, aby znaleźć bardziej szczegółowe wyjaśnienia dotyczące sposobu łączenia funkcji języka w celu włączenia zapytania zintegrowanego z językiem. Dobrym miejscem do rozpoczęcia jest przewodnik: pisanie zapytań w Visual Basic.
Wyrażenia kwerend
Wyrażenia zapytań w Visual Basic można wyrazić w składni deklaratywnej podobnej do wyrażenia SQL lub XQuery. W czasie kompilacji składnia zapytania jest konwertowana na wywołania metod do implementacji dostawcy LINQ standardowych metod rozszerzenia operatora zapytania. Aplikacje kontrolują, które standardowe operatory zapytań znajdują się w zakresie, określając odpowiednią przestrzeń nazw za pomocą instrukcji Imports
. Składnia wyrażenia zapytania języka Visual Basic wygląda następująco:
Dim londonCusts = From cust In customers
Where cust.City = "London"
Order By cust.Name Ascending
Select cust.Name, cust.Phone
Aby uzyskać więcej informacji, zobacz Wprowadzenie do LINQ w Visual Basic.
Niejawnie wpisane zmienne
Zamiast jawnie określać typ podczas deklarowania i inicjowania zmiennej, można włączyć kompilator do wnioskowania i przypisywania typu. Jest to nazywane wnioskowaniem typu lokalnego.
Zmienne, których typy są wnioskowane, są silnie typizowane, podobnie jak zmienne, których typ został określony jawnie. Wnioskowanie typu lokalnego działa tylko wtedy, gdy definiujesz zmienną lokalną wewnątrz treści metody. Aby uzyskać więcej informacji, zobacz Instrukcje wnioskowania opcji i Wnioskowanie typu lokalnego.
Poniższy przykład ilustruje wnioskowanie typu lokalnego. Aby użyć tego przykładu, musisz ustawić wartość Option Infer
On
.
' The variable aNumber will be typed as an integer.
Dim aNumber = 5
' The variable aName will be typed as a String.
Dim aName = "Virginia"
Wnioskowanie typu lokalnego umożliwia również tworzenie typów anonimowych, które zostały opisane w dalszej części tej sekcji i są niezbędne w przypadku zapytań LINQ.
W poniższym przykładzie LINQ wnioskowanie typu występuje, jeśli Option Infer
ma wartość On
lub Off
. Błąd czasu kompilacji występuje, jeśli Option Infer
jest Off
i Option Strict
ma wartość On
.
' Query example.
' If numbers is a one-dimensional array of integers, num will be typed
' as an integer and numQuery will be typed as IEnumerable(Of Integer)--
' basically a collection of integers.
Dim numQuery = From num In numbers
Where num Mod 2 = 0
Select num
Inicjatory obiektów
Inicjatory obiektów są używane w wyrażeniach zapytania, gdy trzeba utworzyć typ anonimowy do przechowywania wyników zapytania. Mogą również służyć do inicjowania obiektów nazwanych typów poza zapytaniami. Za pomocą inicjatora obiektu można zainicjować obiekt w jednym wierszu bez jawnego wywoływania konstruktora. Zakładając, że masz klasę o nazwie Customer
, która ma właściwości publiczne Name
i Phone
wraz z innymi właściwościami, inicjator obiektu może być używany w ten sposób:
Dim aCust = New Customer With {.Name = "Mike",
.Phone = "555-0212"}
Aby uzyskać więcej informacji, zobacz Inicjatory obiektów: nazwane i anonimowe typy.
Typy anonimowe
Typy anonimowe zapewniają wygodny sposób tymczasowego grupowania zestawu właściwości w element, który ma zostać uwzględniny w wyniku zapytania. Dzięki temu można wybrać dowolną kombinację dostępnych pól w zapytaniu w dowolnej kolejności bez definiowania nazwanego typu danych dla elementu.
Typ anonimowy jest tworzony dynamicznie przez kompilator. Nazwa typu jest przypisywana przez kompilator i może ulec zmianie przy użyciu każdej nowej kompilacji. W związku z tym nazwa nie może być używana bezpośrednio. Typy anonimowe są inicjowane w następujący sposób:
' Outside a query.
Dim product = New With {.Name = "paperclips", .Price = 1.29}
' Inside a query.
' You can use the existing member names of the selected fields, as was
' shown previously in the Query Expressions section of this topic.
Dim londonCusts1 = From cust In customers
Where cust.City = "London"
Select cust.Name, cust.Phone
' Or you can specify new names for the selected fields.
Dim londonCusts2 = From cust In customers
Where cust.City = "London"
Select CustomerName = cust.Name,
CustomerPhone = cust.Phone
Aby uzyskać więcej informacji, zobacz Typy anonimowe.
Metody rozszerzania
Metody rozszerzeń umożliwiają dodawanie metod do typu danych lub interfejsu spoza definicji. Ta funkcja umożliwia, w efekcie, dodawanie nowych metod do istniejącego typu bez faktycznego modyfikowania typu. Standardowe operatory zapytań to sam zestaw metod rozszerzeń, które zapewniają funkcjonalność zapytań LINQ dla dowolnego typu, który implementuje metodę IEnumerable<T>. Inne rozszerzenia do IEnumerable<T> uwzględnienia Count, Unioni Intersect.
Poniższa metoda rozszerzenia dodaje metodę print do String klasy.
' Import System.Runtime.CompilerServices to use the Extension attribute.
<Extension()>
Public Sub Print(ByVal str As String)
Console.WriteLine(str)
End Sub
Metoda jest wywoływana jak zwykła metoda Stringwystąpienia klasy :
Dim greeting As String = "Hello"
greeting.Print()
Aby uzyskać więcej informacji, zobacz Metody rozszerzeń.
Wyrażenia lambda
Wyrażenie lambda to funkcja bez nazwy, która oblicza i zwraca pojedynczą wartość. W przeciwieństwie do nazwanych funkcji wyrażenie lambda można zdefiniować i wykonać w tym samym czasie. W poniższym przykładzie zostanie wyświetlona wartość 4.
Console.WriteLine((Function(num As Integer) num + 1)(3))
Możesz przypisać definicję wyrażenia lambda do nazwy zmiennej, a następnie użyć nazwy do wywołania funkcji. Poniższy przykład przedstawia również 4.
Dim add1 = Function(num As Integer) num + 1
Console.WriteLine(add1(3))
W języku LINQ wyrażenia lambda są podkreślone wieloma standardowymi operatorami zapytań. Kompilator tworzy wyrażenia lambda w celu przechwycenia obliczeń zdefiniowanych w podstawowych metodach zapytań, takich jak Where
, , Select
Order By
, Take While
i innych.
Na przykład poniższy kod definiuje zapytanie, które zwraca wszystkich starszych uczniów z listy uczniów.
Dim seniorsQuery = From stdnt In students
Where stdnt.Year = "Senior"
Select stdnt
Definicja zapytania jest kompilowana w kodzie podobnym do poniższego przykładu, który używa dwóch wyrażeń lambda do określenia argumentów dla Where
i Select
.
Dim seniorsQuery2 = students.
Where(Function(st) st.Year = "Senior").
Select(Function(s) s)
Jedną z wersji można uruchomić za pomocą For Each
pętli:
For Each senior In seniorsQuery
Console.WriteLine(senior.Last & ", " & senior.First)
Next
Aby uzyskać więcej informacji, zobacz Wyrażenia lambda.