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

Chcete-li efektivně zapisovat dotazy, měli byste pochopit, jak typy proměnných v úplné operaci dotazu vzájemně souvisí. Pokud rozumíte těmto vztahům, budete snadněji pochopit ukázky LINQ a příklady kódu v dokumentaci. Kromě toho můžete pochopit, co se stane na pozadí, pokud jsou proměnné implicitně typované pomocí var .

Operace dotazů LINQ jsou silně typované ve zdroji dat, v samotném dotazu a v provádění dotazu. Typ proměnných v dotazu musí být kompatibilní s typem prvků ve zdroji dat a typem proměnné iterace v foreach příkazu. Toto silné zadání zaručuje, že při kompilaci jsou zachyceny chyby typu, pokud je lze opravit předtím, než se uživatelé dostanou.

Aby bylo možné předvést tyto vztahy typů, většina příkladů, které následují, používá explicitní psaní pro všechny proměnné. Poslední příklad ukazuje, jak se stejné zásady použijí, i když použijete implicitní zadání pomocí var.

Dotazy, které netransformují zdrojová data

následující ilustrace znázorňuje LINQ to Objects operaci dotazování, která neprovede žádné transformace dat. Zdroj obsahuje posloupnost řetězců a výstup dotazu je také posloupnost řetězců.

Diagram, který zobrazuje vztah datových typů v dotazu LINQ.

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

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

  3. Proměnná dotazu se opakuje v foreach příkazu. Vzhledem k tomu, že je proměnná dotazu posloupností řetězců, je proměnná iterace také řetězcem.

Dotazy, které transformují zdrojová data

Následující ilustrace znázorňuje Technologie LINQ to SQL operaci dotazu, která provádí jednoduchou transformaci dat. Dotaz provede jako vstup sekvenci Customer objektů a Name ve výsledku vybere pouze vlastnost. Vzhledem k tomu Name , že je řetězec, dotaz vytváří sekvenci řetězců jako výstup.

Diagram znázorňující dotaz, který transformuje datový typ.

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

  2. selectPříkaz vrátí Name vlastnost namísto celého Customer objektu. Protože Name je řetězec, argument typu custNameQuery je string , not Customer .

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

Následující ilustrace znázorňuje mírně složitější transformaci. selectPříkaz vrátí anonymní typ, který zachycuje pouze dva členy původního Customer objektu.

Diagram znázorňující složitější dotaz, který transformuje datový typ.

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

  2. Vzhledem k tomu select , že příkaz vytvoří anonymní typ, proměnná dotazu musí být implicitně zadána pomocí var .

  3. Vzhledem k tomu, že typ proměnné dotazu je implicitní, musí být proměnná iterace ve foreach smyčce také implicitní.

Umožnění odvození informací o typu kompilátoru

I když byste měli pochopit vztahy typů v operaci dotazu, máte možnost nechat kompilátor provádět veškerou práci za vás. Klíčové slovo var lze použít pro libovolnou místní proměnnou v operaci dotazu. Následující obrázek je podobný ukázkovému číslu 2, které bylo popsáno dříve. Nicméně kompilátor poskytuje silný typ pro každou proměnnou v operaci dotazu.

Diagram, který zobrazuje tok typu s implicitním zadáním.

Další informace o naleznete var v tématu implicitně typované lokální proměnné.