Sdílet prostřednictvím


Vztahy typů v operacích dotazu LINQ (C#)

Chcete-li psát dotazy efektivně, měli byste pochopit, jak typy všech proměnných v dokončeném dotazu operace vzájemně souvisí.Pokud rozumíte těmto vztahům, snadněji pochopíte ukázky a příklady kódu LINQ v dokumentaci.Kromě toho budete rozumět, co se děje na pozadí, když jsou proměnné implicitně typované pomocí var.

LINQ operace dotazu jsou silně typované ve zdroji dat, v samotném dotazu a ve spuštění dotazu.Typ proměnné dotazů musí být kompatibilní s typem prvků ve zdroji dat a typem iterační proměnné v příkazu foreach.Tato tvorba silných typů zaručuje, že jsou zachyceny chyby typu v době kompilace, kdy je lze opravit dříve, než se dotknou uživatelů.

Pro ukázání těchto vztahů typů většina příkladů, které následují, používá explicitní zadání pro všechny proměnné.Poslední příklad ukazuje, jak se stejné zásady platí i při použití implicitního zápisu pomocí parametru var.

Dotazy, které netransformují zdrojová data

Následující ilustrace ukazuje operaci dotazu LINQ to Objects, která neslouží k transformaci na data.Zdroj obsahuje posloupnosti řetězců a výstup dotazu je také posloupnost řetězců.

Vztah typů dat v dotazu LINQ

  1. Argument typu zdroje dat určuje typ rozsahu proměnných.

  2. Typ objektu, který je vybrán, určuje typ proměnné dotazu.Zde je name řetězec.Proměnná dotazu je tedy IEnumerable<řetězec>.

  3. Proměnná dotazu je procházena pomocí příkazu foreach.Vzhledem k tomu, že je proměnná dotazu sekvencí řetězců, iterační proměnná je také řetězec.

Dotazy, které transformují zdrojová data

Následující ilustrace ukazuje operaci dotazu Technologie LINQ to SQL, která slouží k jednoduché transformaci na data.Dotaz přebírá řadu objektů Customer jako vstup a vybere pouze vlastnost Name ve výsledku.Protože Name je řetězec, dotaz vyprodukuje sekvenci řetězců jako výstup.

Dotaz, který transformuje na datovém typu

  1. Argument typu zdroje dat určuje typ rozsahu proměnných.

  2. Příkaz select vrátí vlastnost Name namísto kompletního objektu Customer.Protože Name je řetězec argument typu custNameQuery je string, nikoli Customer.

  3. Protože je custNameQuery sekvence řetězců, iterační proměnná smyčky foreach musí být také string.

Následující obrázek znázorňuje poněkud složitější transformaci.Příkaz select vrátí anonymní typ, který zachycuje pouze dva členy původního objektu Customer.

Dotaz, který transformuje na datovém typu

  1. Argument typu zdroje dat je vždy typ rozsahu proměnných v dotazu.

  2. Protože příkaz select produkuje anonymní typ, proměnná dotazu musí být implicitně typována pomocí atributu var.

  3. Protože je typ proměnné dotazu implicitní, iterační proměnná ve smyčce foreach musí být také implicitní.

Umožnit kompilátoru odvodit informace o typu

Přestože byste měli rozumět vztahům typů v operaci dotazu, máte možnost nechat kompilátor, aby udělal všechnu práci za vás.Klíčové slovo var lze použít pro všechny místní proměnné v rámci operace dotazu.Následující obrázek je podobný obrázku u příkladu 2, který byl popsán výše.Kompilátor však dodává silný typ pro každou proměnnou v operaci dotazu.

Tok typů s implicitní zadáním příkazu

Další informace o var naleznete v tématu Implicitně typované lokální proměnné (Průvodce programováním v C#).

Viz také

Koncepty

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

Další zdroje

Začínáme s dotazy LINQ v jazyce C#