Sdílet prostřednictvím


Vztahy typů v operacích dotazu (Visual Basic)

Proměnné použité v LINQ (Language-Integrated Query) dotazu operace jsou silný a musí být vzájemně kompatibilní.Silné psaní se používá ve zdroji dat, samotný dotaz a spuštění dotazu.Na následujícím obrázku označuje podmínky používané k popisu LINQ dotazu.Další informace o částech dotazu viz Základní operace dotazů (Visual Basic).

Části LINQ dotazu

Dotaz pseudokódu se zvýrazněným prvky.

Typ proměnné rozsah v dotazu musí být kompatibilní s typem prvků ve zdroji dat.Typ proměnné dotazu musí být kompatibilní s definované v prvku sekvence Select klauzule.Nakonec typ pořadí prvků také musí být kompatibilní s typem řídicí proměnná smyčky, který je používán For Each příkaz, který provede dotaz.Silné zadáním usnadňuje identifikaci chyby typu v čase kompilace.

Visual BasicDíky silné zadáním pohodlný implementací odvození typu místní, také známé jako implicitní psaní.V předchozím příkladu se používá funkce, a se používají v celém LINQ vzorků a dokumentace.V jazyce Visual Basic je provedeno odvození typu místní jednoduše pomocí Dim bez příkazu As klauzule.V následujícím příkladu city silný jako řetězec.

Dim city = "Seattle"

[!POZNÁMKA]

Odvození typu místní funguje pouze při Option Infer je nastavena na On.Další informace naleznete v tématu Option Infer – příkaz.

Však i v případě, že v dotazu použít odvození typu místní, stejný typ relace existují mezi proměnné ve zdroji dat, proměnná dotazu a opakovat spuštění dotazu.Je užitečné mít základní znalosti těchto relací typu při psaní LINQ dotazy nebo práce s ukázky a příklady kódu v dokumentaci.

Pravděpodobně bude nutné zadat explicitní typ proměnné rozsah, který neodpovídá typu vrácených ze zdroje dat.Typ proměnné rozsah lze zadat pomocí As klauzule.Však vede k chybě Pokud je převod zužující převody a Option Strict je nastavena na On.Proto doporučujeme provést převod na hodnot načtených ze zdroje dat.Hodnoty můžete převést ze zdroje dat na rozsah explicitní typ proměnné pomocí Cast``1 metoda.Můžete také obsadit hodnot vybraných v Select klauzule explicitní typ, který je odlišný od typu proměnné rozsah.Tyto body jsou znázorněny v následujícím kódu.

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)

Dotazy, které vracejí celý prvky zdroj dat.

Následující příklad ukazuje LINQ operaci, která vrací pořadí prvků vybrané ze zdroje dat dotazu.Zdroje, names, obsahuje pole řetězců, a výstup dotazu je sekvence obsahující řetězce, které začínají písmenem 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

Je ekvivalentní následující kód, ale je mnohem kratší a snazší.Závisí na typu místní odvození v dotazech je preferovaný styl v jazyce 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

Zda typy jsou určeny explicitně nebo implicitně v oba předchozí příklady kódu existují následující vztahy.

  1. Typ prvků ve zdroji dat, names, je typ proměnné rozsah name, v dotazu.

  2. Typ objektu, který je vybrán name, určuje typ proměnné dotazu mNames.Zde name je řetězec, takže proměnná dotazu je IEnumerable (Z řetězce) v jazyce Visual Basic.

  3. Dotaz definovaný v mNames se provádí For Each smyčky.Smyčky, iterace nad výsledkem spuštění dotazu.Protože mNames, pokud je spuštěn, sekvence řetězce iterační proměnná smyčky vrátí nm, je také řetězec.

Dotazy, které vracejí jedno pole z vybrané prvky

Následující příklad ukazuje Technologie LINQ to SQL operaci, která vrací sekvence obsahující pouze jednu část každého prvku ze zdroje dat vybraný dotaz.Dotaz trvá kolekce Customer objekty jako zdroj dat a projekty pouze Name vlastnost ve výsledku.Jméno zákazníka je řetězec, výsledkem dotazu sekvence řetězce jako výstup.

' 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

Vztahy mezi proměnnými jsou stejně jako v příkladu jednodušší.

  1. Typ prvků ve zdroji dat, customers, je typ proměnné rozsah cust, v dotazu.V tomto příkladu, který typ je Customer.

  2. Select Příkaz vrátí Name vlastnosti každého Customer objekt namísto celého objektu.Protože Name je řetězec dotazu proměnné custNames, znovu bude IEnumerable (Z řetězce), není z Customer.

  3. Protože custNames představuje posloupnost řetězce, For Each smyčky iterační proměnná custName, musí být řetězec.

V předchozím příkladu by náročnější zapisovat a pochopit, jak ukazuje následující příklad bez místní typ odvození.

' 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

Dotazy, které vyžadují anonymní typy

Následující příklad ukazuje složitější situace.V předchozím příkladu bylo obtížné explicitně zadat typy všech proměnných.V tomto příkladu je nemožné.Namísto výběru celého Customer prvky ze zdroje dat nebo jedno pole z každého prvku Select klauzule v tomto dotazu vrátí dvě vlastnosti původní Customer objekt: Name a City.Odpověď Select klauzule, kompilátor definuje anonymní typ, který obsahuje tyto dvě vlastnosti.Výsledkem spuštění nameCityQuery v For Each smyčky je instancí nové anonymní typ kolekce.Protože anonymní typ nemá žádný název použitelné, nelze zadat typ nameCityQuery nebo custInfo explicitně.Je anonymní typu máte použít místo názvu žádné String v IEnumerable(Of String).Další informace naleznete v tématu Anonymní typy (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

Ačkoli není možné zadat typy všech proměnných v předchozím příkladu, vztahy zůstávají stejné.

  1. Typ prvků ve zdroji dat je znovu typ proměnné rozsah v dotazu.V tomto příkladu cust je instance Customer.

  2. Protože Select prohlášení vytváří anonymní typ proměnné dotazu nameCityQuery, musí být zadány implicitně jako anonymní typ.Anonymní typ nemá žádný název použitelné a proto nemůže být explicitně určeny.

  3. Typ proměnné iterace v For Each smyčky je anonymní typ vytvořené v kroku 2.Protože má typ použít název, typ proměnné iteraci smyčky musí být stanovena implicitně.

Viz také

Koncepty

Anonymní typy (Visual Basic)

Odvození místního typu (Visual Basic)

Představení technologie LINQ v jazyce Visual Basic

Další zdroje

Začínáme s dotazy LINQ v jazyce Visual Basic

LINQ v jazyce Visual Basic

Dotazy (Visual Basic)