Relacje typu w operacjach zapytań (Visual Basic)

Zmienne używane w Zapytanie o języku zintegrowanym (LINQ) kwerendy operacje mają jednoznacznie określone typy i muszą być zgodne ze sobą.Wpisując silne jest używany w źródle danych, w samej kwerendzie i wykonanie kwerendy.Następująca ilustracja identyfikuje terminy używane do opisu LINQ kwerendy.Aby uzyskać więcej informacji na temat części kwerendy, zobacz Podstawowe operacje zapytań (Visual Basic).

Części zapytanie LINQ

Zapytanie pseudocode z elementami wyróżniona.

Typ zmiennej zakres kwerendy musi być zgodny z typem elementów w źródle danych.Typ zmiennej kwerendy muszą być zgodne z elementem sekwencji określonych w Select klauzuli.Wreszcie, typ elementów sekwencji również muszą być zgodne z typu zmienna sterująca pętli, który jest używany w For Each instrukcji, która wykonuje kwerendę.Silne wpisując ułatwia identyfikację typu błędów w czasie kompilacji.

Visual Basicpowoduje, że silny, wpisując wygodne implementując wnioskowanie typu lokalnego, znany również jako niejawny wpisując.Że w poprzednim przykładzie jest używana funkcja i zobaczą je używane w całym LINQ przykładów i dokumentacji.W języku Visual Basic wnioskowanie typu lokalnego jest realizowane po prostu za pomocą Dim instrukcji bez As klauzuli.W poniższym przykładzie city ma jednoznacznie określony jako ciąg znaków.

Dim city = "Seattle"

[!UWAGA]

Wnioskowanie typu lokalnego działa tylko wtedy, gdy Option Infer jest ustawiona na On.Aby uzyskać więcej informacji, zobacz Option Infer — Instrukcja.

Jednak nawet wtedy, gdy wnioskowanie typu lokalnego można użyć w kwerendzie, tej samej relacji typu są obecne wśród zmiennych w źródle danych, zmienna kwerendy i pętla wykonanie kwerendy.Warto mieć podstawową wiedzę o tych relacji typu podczas pisania LINQ kwerendy lub Praca z próbki i przykłady kodu w dokumentacji.

Należy określić jawnie określony typ zmiennej zakresu, nie pasuje do typu, zwracane ze źródła danych.Typ zmiennej zakres można określić za pomocą As klauzuli.Jednak to powoduje błąd, jeśli konwersja jest zawężanie konwersji i Option Strict jest ustawiona na On.Dlatego firma Microsoft zaleca przeprowadzenie konwersji na wartości pobierane ze źródła danych.Można przekonwertować wartości ze źródła danych do zakresu wyraźnej typu zmiennej za pomocą Cast``1 metody.Można też rzutować wartooci wybranych w Select klauzuli z typem jawnym różni się od typu zmienna do zakresu.Punkty te są przedstawione w poniższym kodzie.

Dim numbers1() As Integer = {1, 2, 4, 16, 32, 64}
Dim numbers2() As Double = {5.0#, 10.0#, 15.0#}

' This code does not result in an error. 
Dim numberQuery1 = From n As Integer In numbers1 Where n > 5

' This code results in an error with Option Strict set to On. The type Double 
' cannot be implicitly cast as type Integer. 
Dim numberQuery2 = From n As Integer In numbers2 Where n > 5

' This code casts the values in the data source to type Integer. The type of 
' the range variable is Integer. 
Dim numberQuery3 = From n In numbers2.Cast(Of Integer)() Where n > 5

' This code returns the value of the range variable converted to Integer. The type of 
' the range variable is Double. 
Dim numberQuery4 = From n In numbers2 Where n > 5 Select CInt(n)

Kwerend zwracających elementy całego źródła danych

W poniższym przykładzie LINQ kwerendy operację, która zwraca sekwencja elementów wybranych z danych źródłowych.Źródło, names, zawiera tablicę ciągów, a dane wyjściowe kwerendy jest sekwencją zawierających ciągi rozpoczynające się od litery M.

Dim names = {"John", "Rick", "Maggie", "Mary"}
Dim mNames = From name In names
             Where name.IndexOf("M") = 0
             Select name

For Each nm In mNames
    Console.WriteLine(nm)
Next

Jest odpowiednikiem poniższy kod, ale jest znacznie krótsze i łatwiejsze do zapisu.Poleganie na wnioskowanie typu lokalnego w kwerendach jest preferowanego stylu w języku Visual Basic.

Dim names2 = {"John", "Rick", "Maggie", "Mary"}
Dim mNames2 As IEnumerable(Of String) =
    From name As String In names
    Where name.IndexOf("M") = 0
    Select name

For Each nm As String In mNames
    Console.WriteLine(nm)
Next

W obu poprzednich przykładach kodu, istnieją następujące relacje, czy typy są określone jawnie lub niejawnie.

  1. Typ elementów w źródle danych, names, jest to typ zmiennej zakres name, w kwerendzie.

  2. Typ obiektu, który jest wybrany, name, określa typ zmiennej kwerendy mNames.W tym miejscu name jest ciągiem, dlatego zmienna kwerendy jest IEnumerable (Z ciągiem) w języku Visual Basic.

  3. Kwerenda określona w mNames jest wykonywana w For Each pętli.Nad wynikiem wykonania kwerendy dokonuje iteracji pętli.Ponieważ mNames, gdy jest wykonywane, zwróci Sekwencja ciągów, Zmienna iteracji pętli, nm, również jest ciągiem.

Kwerend zwracających jedno pole z zaznaczonych elementów

W poniższym przykładzie LINQ do SQL operację, która zwraca sekwencji, zawierające tylko jedną część każdego elementu wybrane źródło danych kwerendy.Kwerenda pobiera zbiór Customer obiekty ze źródłem danych i projektów tylko Name właściwość w wyniku.Ponieważ nazwa klienta jest ciągiem, kwerenda zwraca sekwencji ciągi jako dane wyjściowe.

' Method GetTable returns a table of Customer objects.
Dim customers = db.GetTable(Of Customer)()
Dim custNames = From cust In customers 
                Where cust.City = "London" 
                Select cust.Name

For Each custName In custNames
    Console.WriteLine(custName)
Next

Relacje między zmiennymi są podobnie jak w przykładzie prostsze.

  1. Typ elementów w źródle danych, customers, jest to typ zmiennej zakres cust, w kwerendzie.W tym przykładzie, który jest typu Customer.

  2. Select Zwracanych przez instrukcję Name właściwości każdego Customer obiekt zamiast całego obiektu.Ponieważ Name jest ciągiem, zmienna kwerendy custNames, ponownie będzie IEnumerable (Z ciągu), nie Customer.

  3. Ponieważ custNames reprezentuje sekwencję ciągów, For Each Zmienna iteracji pętli, custName, musi być ciągiem.

Bez wnioskowanie typu lokalnego poprzedniego przykładu byłaby bardziej skomplikowana, zapisu i zrozumieć, jak pokazano w następującym przykładzie.

' Method GetTable returns a table of Customer objects.
 Dim customers As Table(Of Customer) = db.GetTable(Of Customer)()
 Dim custNames As IEnumerable(Of String) = 
     From cust As Customer In customers 
     Where cust.City = "London" 
     Select cust.Name

 For Each custName As String In custNames
     Console.WriteLine(custName)
 Next

Kwerendy, które wymagają typy anonimowe

W poniższym przykładzie przedstawiono bardziej złożonych sytuacji.W poprzednim przykładzie został niewygodna jawnie określić typy wszystkich zmiennych.W tym przykładzie jest niemożliwe.Zamiast wybierać cały Customer elementów ze źródła danych lub pojedyncze pole z każdego elementu Select klauzuli w tej kwerendzie zwraca dwie właściwości oryginał Customer obiekt: Name i City.W odpowiedzi na Select klauzuli, kompilator definiuje typ anonimowy, który zawiera te dwie właściwości.Wynikiem nameCityQuery w For Each pętli jest kolekcją wystąpień nowy typ anonimowy.Ponieważ nie można używać nazwy typ anonimowy, nie można określić typ nameCityQuery lub custInfo jawnie.Oznacza to, że z typ anonimowy, masz do wykorzystania w miejsce nazwy typu String w IEnumerable(Of String).Aby uzyskać więcej informacji, zobacz Typy anonimowe (Visual Basic).

' Method GetTable returns a table of Customer objects.
Dim customers = db.GetTable(Of Customer)()
Dim nameCityQuery = From cust In customers 
                    Where cust.City = "London" 
                    Select cust.Name, cust.City

For Each custInfo In nameCityQuery
    Console.WriteLine(custInfo.Name)
Next

Chociaż nie jest możliwe określenie typów dla wszystkich zmiennych w poprzednim przykładzie, relacje pozostają takie same.

  1. Typ elementów w źródle danych jest ponownie typu zmiennej zakres w kwerendzie.W tym przykładzie cust jest instancją Customer.

  2. Ponieważ Select instrukcji produkuje typ anonimowy, zmienna kwerendy nameCityQuery, muszą być wpisane niejawnie jako typ anonimowy.Typ anonimowy nie ma można używać nazwy i dlatego nie może być określone jawnie.

  3. Typ zmiennej iteracji w For Each pętli jest typ anonimowy, utworzony w kroku 2.Ponieważ nie można używać nazwy typu, musi niejawnie określić typu Zmienna iteracji pętli.

Zobacz też

Koncepcje

Typy anonimowe (Visual Basic)

Wnioskowanie o typie lokalnym (Visual Basic)

Wprowadzenie do LINQ w Visual Basic

Inne zasoby

Wprowadzenie do programu LINQ w Visual Basic

LINQ w Visual Basic

Zapytania (Visual Basic)