LINQ a EF - Úvod

1. díl - LINQ a EF - Úvod

Martin Dybal       26.08.2014       Entity Framework, LINQ       15653 zobrazení

V tomto seriálu se zaměříme na dvě součásti .NET Frameworku, bez kterých si neumí představit svoji práci nejeden programátor – LINQ a Entity Framework. V první polovině si vysvětlíme a popíšeme, jak funguje LINQ (Language INtegrated Query). V té druhé rozšíříme nabyté znalosti o práci s databázemi pomocí Entity Frameworku.

Co je to LINQ

LINQ je sada technik a rozšíření, které nám umožňují dotazování nad různými zdroji dat v prostředí .NETu. Umožňuje nám například filtrování, řazení nebo propojování dat. Poprvé byl představen v roce 2005 jako technický náhled, poté byl zaintegrován do .NET Framework 3.5 spolu s jazyky C# 3.0 a VB.NET 9.0, které obsahují rozšíření pro podporu LINQu. Ve verzi 4.0 byla přidána podpora paralelního dotazování nazvaná PLINQ (Parallel LINQ).

K čemu je LINQ dobrý

Jednou z velkých výhod LINQu je, že nám umožňuje se dotazovat stejným způsobem nad různými kolekcemi dat. Stejný dotaz lze použít nad Listem, nad XML dokumentem, databází nebo HTML. LINQ můžeme použít nad jakýmkoli datovým zdrojem, pro který máme LINQ providera. Přímou součástí .NET jsou LINQ to Object, LINQ to XML, LINQ to SQL a LINQ to DataSet. Samozřejmě existuje mnoho dalších providerů např.: LINQ to HTML, LINQ to reflection, LINQ to JSON, LINQ to SharePoint.

LINQ to Objects

Umožňuje dotazování nad poli či kolekcemi uloženými v paměti. Dotazování je možné nad všemi typy implementujícími rozhraní IEnumerable<T>.

LINQ to XML

Jak název napovídá, tak umožňuje práci s XML soubory. Jedná se o silný nástroj pro práci s XML. LINQ to XML si podrobně rozebereme v jedné z následujících kapitol.

LINQ to SQL

Umožňuje dotazování do databází MS SQL. Překládá příkazy z jazyku C# (či jiných jazyků .NET Frameworku) do SQL. K tomu je potřeba namapovat objektový model na model databáze. Protože se v seriálu budeme zabývat Entity Frameworkem, tak LINQ to SQL nebudeme dále popisovat. Kdo má zájem, může se dozvědět více na http://msdn.microsoft.com/cs-cz/library/bb386976.aspx.

LINQ to DataSets

Taktéž jako LINQ to SQL pracuje s daty z databáze, ale nestará se o jejich získání. Nad DataSetem můžeme provádět filtrovací a další operace. Více informací na http://msdn.microsoft.com/cs-cz/library/bb386977(v=vs.110).aspx.

LINQ a syntaxe

Existují dva druhy LINQ syntaxe:

1. Klasická výrazová

2. SQL like

Lepší než složitý popis bude ukázka. Záleží na každém, jaký zápis bude preferovat, často se zápisy kombinují. Všimněte si, že nikde nenastavujeme, nad jakými daty se dotazujeme. Orders může být tabulka v databázi, Customers může být XML, LINQ to vyřeší za nás.

var query = Orders.Where(o => o.Price > 1000).Join(Customers,
                                                   o =>o.CustomerID,
                                                   c => c.ID,
                                                   (o, c) => new { c.Name, c.Address, o.Price });
var query = from o in Orders join c in Customers on o.CustomerID equals c.ID 
where o.Price > 1000 
select new {c.Name, c.Address};

Deklarativní paradigma

Dalším podstatným rozdílem je přístup, jakým data získáváme. Kdybychom chtěli dotaz z minulého příkladu napsat bez použití LINQ, tak napíšeme něco takového:

foreach (Order o in Orders)
{
    foreach (Customer c in Customers)
    {
        if (o.CustomerID == c.ID && o.Price > 1000)
        { 
            Console.WriteLine("Name: {0}\tAdrress: {1}\t\tPrice: {2}", c.Name, c.Address, o.Price);
        }
    }
}

V C# musíme přesně popsat jak data získat, zatímco LINQu říkáme, jaká data chceme a necháváme na něm, jak je získá.

Souhrn

V prvním díle jsme si představili LINQ a jeho historii, pověděli si nad jakými zdroji dat můžeme pomocí LINQu pracovat a ukázali si dva druhy zápisu LINQ dotazu. Na konci jsme si ukázali, jak by asi vypadal kód, kterým bychom suplovali předchozí dotaz. V příštím díle si ukážeme lambda výrazy a extension metody, abychom lépe pochopili, jak LINQ funguje.

 

hodnocení článku

0       Hodnotit mohou jen registrované uživatelé.

 

Všechny díly tohoto seriálu

2. LINQ – Rozšíření jazyka C# 07.05.2016
3. LINQ - Rozhraní Ienumerable, iqueryable a yield return 20.09.2014
1. LINQ a EF - Úvod 26.08.2014

 

 

 

Nový příspěvek

 

Příspěvky zaslané pod tento článek se neobjeví hned, ale až po schválení administrátorem.

Pár připomínek

Jako úvod fajn, ale měl bych pár poznámek.

1) Proč míchat dohromady LINQ a EF? Já třeba EF nepoužívám, protože je pomalý. Udělal bych z toho seriál jen o LINQ a EF nechal zvlášť, vždyť to jsou dva úplně různé koncepty. Je lepší dělat jednu věc a dělat ji pořádně.

2) Nezapomeň také na sekci či díl "K čemu LINQ není dobrý" nebo spíš "V jaké situaci není dobrý".

3) "Dotazování je možné nad všemi třídami implementujícími rozhraní IEnumerable<T>." - znamená to, že se nemůžu dotazovat nad structy implementujícími rozhraní IEnumerable<T>?

4) "Naplnit DataSet musíme klasicky pomocí ADO.NET" - Nemusíme. DataSet není na ADO.NET nijak závislý.

5) "zatímco LINQu říkáme" - LINQ není černá krabička na pozadí, které něco říkáme, LINQ je jen prostřdek pro vyjadřování, těžkou práci pořád dělá compiler ... takže lépe "zatímco použitím LINQ vyjadřujeme, jaká data chceme, ale ne jak je získat (občas ho musíme ale nasměrovat pro lepší výsledky)"

6) chybí mi zmínka o rozhraní IQueryable<T> ve výčtu použitelnosti, občas nazýváno LINQ to Anything

7) doplnil bych informaci, že query syntax (SQL like) je při kompilaci přeložena na lambda syntax (klasická výrazová), takže je opravdu jedno, jak se dotazy zapisují, nicméně jsou situace, kdy se jeden čte lépe než druhý a pak situace, kdy je potřeba query syntax doplnit tím, co umí lambda syntax (First, Single, atd.)

nahlásit spamnahlásit spam 4 / 4 odpovědětodpovědět

Ahoj,

dohromady je to proto, že takový byl požadavek. Původně měl být LINQ celkem stručný, ale my ho rozebereme řekl bych důkladně. Ve finále budou dvě části, kdy v první části budou díly o LINQu a v druhé o EF. Podle mě to ničemu nevadí.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Když vaříš oběd, taky nejdřív děláš polévku a pak v tom samém hrnci opečeš maso s bramborama? Těžko. Sice se to všechno sní v rámci jednoho posezení, ale děláš to souběžně v různých nádobách a pro každý pokrm připravíš vhodné prostředí.

Důkladné rozebrání LINQu je podle mě samo o sobě na 20 obsáhlých dílů (jen rozbor všech operátorů je spousta psaní). Proč lepit k LINQ štítek EF, když EF na LINQ závislé není a můžete o těchto dvou tématech psát souběžně?

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Ahoj,

Jak už psal Filip byl požadavek na seriál LINQ a EF viz. MSP skupina. Bude se jednat o dva seriály. Napřed bude LINQ a myslím že se přiblížíme k těm dvaceti dílům a na to naváže EF, tohle je společný úvod.

Není to černá krabička, ale můžeš ho tak brát. Samozřejmě aby z LINQu dostals maximum musíš vědět jak funguje. Viz. http://latentflip.com/imperative-vs-decl...

O IQueryable<T> bude třetí díl.

Popis syntaxí bude také rozebrán později a vše je tam zmíněno.

Chyby opravím v článku, díky!

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.

Nyní zakládáte pod článkem nové diskusní vlákno.
Pokud chcete reagovat na jiný příspěvek, klikněte na tlačítko "Odpovědět" u některého diskusního příspěvku.

Nyní odpovídáte na příspěvek pod článkem. Nebo chcete raději založit nové vlákno?

 

  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

Příspěvky zaslané pod tento článek se neobjeví hned, ale až po schválení administrátorem.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback