Sdílet prostřednictvím


Jazykový integrovaný dotaz (LINQ)

Language-Integrated Query (LINQ) je název sady technologií založených na integraci schopností dotazů přímo do jazyka C#. Tradičně se dotazy na data vyjadřují jako jednoduché řetězce bez kontroly typů v době kompilace nebo podpory IntelliSense. Kromě toho se musíte naučit jiný dotazovací jazyk pro každý typ zdroje dat: databáze SQL, dokumenty XML, různé webové služby atd. Pomocí LINQ je dotaz prvotřídní jazykový konstruktor, stejně jako třídy, metody a události.

Při psaní dotazů je nejviditelnější "jazykově integrovaná" část LINQ výrazem dotazu. Výrazy dotazu se zapisují do deklarativní syntaxe dotazu. Pomocí syntaxe dotazu provádíte operace filtrování, řazení a seskupování u zdrojů dat s minimálním kódem. Stejné vzory výrazů dotazu použijete k dotazování a transformaci dat z libovolného typu zdroje dat.

Následující příklad ukazuje úplnou operaci dotazu. Úplná operace zahrnuje vytvoření zdroje dat, definování výrazu dotazu a spuštění dotazu v foreach příkazu.

// Specify the data source.
int[] scores = [97, 92, 81, 60];

// Define the query expression.
IEnumerable<int> scoreQuery =
    from score in scores
    where score > 80
    select score;

// Execute the query.
foreach (var i in scoreQuery)
{
    Console.Write(i + " ");
}

// Output: 97 92 81

Možná budete muset přidat direktivu using , using System.Linq;pro předchozí příklad kompilace. Nejnovější verze .NET využívají implicitní použití k přidání této direktivy jako globálního použití. Starší verze vyžadují, abyste ho přidali do zdroje.

Přehled výrazů dotazu

  • Výrazy dotazů kontrolují a transformují data z libovolného zdroje dat s podporou LINQ. Jeden dotaz může například načíst data z databáze SQL a vytvořit datový proud XML jako výstup.
  • Výrazy dotazů používají mnoho známých konstruktorů jazyka C#, které usnadňují čtení.
  • Proměnné ve výrazu dotazu jsou všechny silně typované.
  • Dotaz se nespustí, dokud neiterujete proměnnou dotazu, například v příkazu c0.
  • V době kompilace kompilátor převede výrazy dotazu na volání metody standardního operátoru dotazu podle pravidel definovaných ve specifikaci jazyka C#. Libovolný dotaz, který používá syntaxi dotazu, můžete vyjádřit pomocí syntaxe metody. V některých případech je syntaxe dotazu čitelnější a stručnější. V jiných je syntaxe metody čitelnější. Mezi těmito dvěma různými formami není žádný sémantický rozdíl ani výkon. Další informace najdete v tématu Specifikace jazyka C# a Přehled standardních operátorů dotazů.
  • Některé operace dotazu, například Count nebo Max, nemají žádnou ekvivalentní klauzuli výrazu dotazu a musí být vyjádřeny jako volání metody. Syntaxi metody můžete kombinovat s syntaxí dotazů různými způsoby.
  • Výrazy dotazu se dají zkompilovat do stromů výrazů nebo delegátů v závislosti na typu, na který se dotaz použije. Kompilátor zkompiluje IEnumerable<T> dotazy delegátům. Kompilátor kompiluje dotazy IQueryable a IQueryable<T> do stromů výrazů. Další informace najdete v tématu Stromy výrazů.

Jak povolit LINQ dotazování vašeho zdroje dat

Data v paměti

Dotazování LINQ na data v paměti můžete povolit dvěma způsoby. Pokud jsou data typu, který implementuje IEnumerable<T>, dotazujte data pomocí LINQ to Objects. Pokud nedává smysl povolit výčet implementací rozhraní IEnumerable<T>, definujte metody standardního operátoru dotazu LINQ buď v daném typu, nebo jako rozšiřující členy pro tento typ. Vlastní implementace standardních operátorů dotazů by měly k vrácení výsledků použít odložené spuštění.

Vzdálená data

Nejlepší možností pro povolení dotazování LINQ vzdáleného zdroje dat je implementace IQueryable<T> rozhraní.

IQueryable – poskytovatelé LINQ

Poskytovatelé LINQ, kteří implementují IQueryable<T> , se můžou značně lišit v jejich složitosti.

Méně složitý IQueryable zprostředkovatel může přistupovat k jedné metodě z webové služby. Tento typ poskytovatele je specifický pro zdroj dat, protože očekává konkrétní informace v dotazech, které zpracovává. Má uzavřený typový systém, možná odhalující jeden typ výsledku. Většina provádění dotazu probíhá místně, například pomocí Enumerable implementací standardních operátorů dotazu. Méně složitý zprostředkovatel může zkoumat pouze jeden výraz volání metody ve stromu výrazů, který představuje dotaz, a nechat zbývající logiku dotazu zpracovat jinde.

Poskytovatel IQueryable střední složitosti může cílit na zdroj dat, který má částečně výrazný dotazovací jazyk. Pokud se zaměřuje na webovou službu, může přistupovat k více než jedné metodě této služby a na základě informací z dotazu vybrat, kterou metodu zavolat. Poskytovatel střední složitosti má bohatší systém typů než jednoduchý poskytovatel, ale je to stále pevný systém typů. Například poskytovatel může zpřístupnit typy, které mají vztah typu 1:N, jenž lze procházet, ale nenabízí mapovací technologii pro typy definované uživatelem.

Složitý IQueryable zprostředkovatel, například zprostředkovatel Entity Framework Core , může přeložit kompletní dotazy LINQ do výrazového dotazovacího jazyka, jako je SQL. Složitější poskytovatel je obecnější, protože dokáže zpracovat širší škálu otázek v dotazu. Má také otevřený typový systém, a proto musí obsahovat rozsáhlou infrastrukturu pro mapování uživatelsky definovaných typů. Vývoj komplexního poskytovatele vyžaduje značné úsilí.