LINQ a EF - Úvod

Na webu dotNETportal.cz začíná vycházet seriál o LINQu a Entity Frameworku. První díl vám přinášíme i na našem blogu, pokud vás zaujme, určitě se potom na dotNETportal stavte pro další.


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 třídami 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 https://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í. Naplnit DataSet musíme klasicky pomocí ADO.NET a nad tímto DataSetem můžeme provádět filtrovací a další operace. Více informací na https://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.

Filip Herudek, Martin Dybal