LINQ

Z Wikipedie, otevřené encyklopedie
Skočit na: Navigace, Hledání

LINQ (anglicky Language Integrated Query) je integrovaný jazyk pro dotazování, který byl představen spolu s jazyky C# 3.0 a Visual Basic 9 spolu s .NET Frameworkem 3.5. LINQ přináší nový způsob pro dotazování nad jakýmikoliv daty, usnadňuje jejich tvorbu, třídění, jejich propojování i vyhledávání v nich.

Možnosti LINQ[editovat | editovat zdroj]

LINQ je navrhnut jako poměrně obecný nástroj, takže je možné v něm manipulovat s různými daty. LINQ to Objects umožňuje dotazování nad normálními objekty (respektive jejich kolekcemi), LINQ to SQL přináší nový způsob pro práci s databázemi a LINQ to XML umožňuje pracovat s XML soubory. Na internetu jsou dostupné i další implementace LINQu, jako je například LINQ to Amazon, který slouží pro vyhledávání knih v tomto internetovém obchodě.

Použití LINQ[editovat | editovat zdroj]

Výše jmenované jazyky byly rozšířeny o nová klíčová slova a další podpůrné jazykové konstrukce.

Klíčové pro pochopení jazyka LINQ a také následujících příkladů je zejména znalost těchto konstrukcí:

  • Lambda výrazy jsou jednodušší metodou zápisu anonymních metod.
  • Inicializátory objektů a kolekcí.
  • Rozšiřující metody.
  • Anonymní třídy umožňující např. rychlé vytvoření objektů přenášejících informace vyžádané z databáze přes LINQ.
  • Klíčové slovo var, nutná to podmínka pro využití anonymních tříd.
  • Výrazové stromy (expression trees) umožňující za jistých podmínek kompilátoru místo vyhodnocení výrazu vytvoření jeho objektové reprezentace.

Ukázková použití[editovat | editovat zdroj]

Výběr a třídění[editovat | editovat zdroj]

Výběr všech řetězců, jejichž délka je menší než 5 znaků, spolu se setříděním těchto řetězců dle délky ukazuje následující jednoduchý příklad:

string[] slova= {"Ahoj", "Čau", "Dobrý den", "Na shledanou", "Dobrou noc"};
var kratkaSlova = from c in slova
 where c.Length < 5
 orderby c.Length
 select c;
foreach (string slovo in kratkaSlova)
{
 Console.WriteLine(slovo);
}

Rozeberme si tento kousek kódu:

První řádek – deklaruje pole s několika řetězci s různou délkou

Druhý řádek – začíná klíčovým slovem var, což kompilátoru sdělí, že si má typ deklarované proměnné odvodit sám z dalšího kontextu, takže ve skutečnosti se za konstrukcí var kratkeSlova skrývá IOrderedEnumerable<string> kratkeSlova, a to již v době kompilace programu. Text from c in slova znamená, že se postupně projde celé pole slova a při každém průchodu přiřadí toto slovo do pomocné proměnné c.

Třetí řádek – zde použijeme klíčové slovo where, abychom omezili výběr slov pouze na ty, která jsou kratší než zadané číslo (5)

Čtvrtý řádek – celý seznam setřídit podle délky jednotlivých řetězců

Zbytek již se stará pouze o vypsání setříděného pole na obrazovku.

Lambda výrazy[editovat | editovat zdroj]

LINQ je možné používat v méně upovídané formě také pomocí rozšiřujících metod a Lambda výrazů. Ukázka programu, který dělá to samé, co program předchozí:

string[] slova= {"Ahoj", "Čau", "Dobrý den", "Nashledanou", "Dobrou noc"};
var kratkaSlova = slova.Where(c => c.Length < 5).OrderBy(c => c.Length);
foreach (string slovo in kratkaSlova)
{
 Console.Writeline(slovo);
}

Tato verze dělá přesně to samé, co předchozí program, pouze využívá rozšiřujících metod. V tomto případě umožňuje zavolat metody Where a OrderBy na poli řetězců, protože jsou tyto metody definovány pro všechny objekty implementující rozhraní IEnumerable<T>, které je alespoň co se týče LINQu klíčové.

Úsek kódu Where(c => c.Length < 5) využívá zmíněných Lambda výrazů, za c se postupně dosadí každý jednotlivý řetězec z pole slova a vyhodnotí se udaná podmínka.

Výhodou LINQu je že naprosto stejnou konstrukcí se pracuje s jakýmikoliv daty, takže není problém vyhledávat data v XML souborech či databázích prakticky stejným způsobem.

Klíčová slova LINQ[editovat | editovat zdroj]

  • Select – výběr hodnoty kterou chceme použít
  • SelectMany – výběr více hodnot najednou (např. pole)
  • Join – spojení více poskytovatelů dat
  • GroupBy – rozdělení dat do více skupin podle určitého klíče
  • Where – omezení výběru prvků podle specifikované podmínky
  • OrderBy, OrderByDescending – specifikace třídění, umožňuje výběr elementu podle kterého se má třídit
  • First, Last – výběr prvního nebo posledního prvku z kolekce
  • ElementAt – výběr prvku podle udaného indexu
  • Count – počet prvků v kolekci
  • Union, Intersect, Except – definice množinových operací sjednocení, průnik a rozdíl
  • Sum, Min, Max, Average – vrací součet, minimální, maximální či průměrnou hodnotu z dané kolekce
  • Reverse – otočí pořadí prvků v kolekci
  • Concat – spojí dvě kolekce dohromady
  • OfType – výběr pouze těch prvků, které jsou specifikovaného typu

LINQ to Objects[editovat | editovat zdroj]

Slouží pro dotazování nad daty, která již jsou v paměti, tj. nad poli a dalšími třídami implementující rozhraní IEnumerable<T>. Dotazovací engine je spuštěn spolu s programem a umožňuje lokální dotazování. Tento způsob dotazování není dynamický, takže jakmile se jeden dotaz vyhodnotí a vrátí výslednou množinu, tak se do něj již nepromítají změny v původních datech.

LINQ to SQL[editovat | editovat zdroj]

Umožňuje dotazování nad databázemi využívající rozhraní MS SQL. Jelikož tyto databáze mají svůj vlastní dotazovací jazyk SQL, není zde přímo nasazen dotazovací engine LINQ, ale místo toho se příkazy LINQu mapují na odpovídající příkazy SQL. Jelikož jsou ale data v těchto databázích uložena jako relační, musí být ještě nasazen tzv. mapper těchto dat na objektová data která používá LINQ. Výhodou použití LINQu místo klasického přístupu je zejména objektový pohled na data.

LINQ to XML[editovat | editovat zdroj]

Slouží pro práci s daty uložených v XML souborech, nepoužívá ani programování založené na DOM nebo SAX, ale jde novou cestou, kdy je k datům přistupováno plně objektově.

Externí odkazy[editovat | editovat zdroj]

Česky[editovat | editovat zdroj]

Anglicky[editovat | editovat zdroj]