Poznámka
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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 dotazů se zapisují v deklarativní syntaxi 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 pro dotazování dotazují a transformují data z libovolného zdroje dat s podporou LINQ. Například jeden dotaz může 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 se výrazy dotazu převedou na volání metody standardního operátoru dotazu podle pravidel definovaných ve specifikaci jazyka C#. Libovolný dotaz, který lze vyjádřit pomocí syntaxe dotazu, lze také 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 proto musí být vyjádřena jako volání metody. Syntaxi metody je možné 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. IEnumerable<T> dotazy jsou kompilovány delegátům. Dotazy IQueryable a IQueryable<T> se kompilují 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
Existují dva způsoby, jak povolit dotazování LINQ na data v paměti. Pokud jsou data typu, který implementuje IEnumerable<T>, dotazujete data pomocí LINQ to Objects. Pokud nemá smysl povolit enumeraci implementováním rozhraní IEnumerable<T>, definujete standardní metody operátoru dotazu LINQ buď v rámci daného typu, nebo jako rozšiřující metody pro daný 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 velmi specifický, 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 by měl bohatší systém typů než jednoduchý poskytovatel, ale stále by to byl pevný typový systém. Poskytovatel může například zveřejnit typy, které mají relace 1:N, které je možné přecházet, ale neposkytuje technologii mapování pro uživatelem definované typy.
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í.