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.