Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Lekce 10 - LINQ ve VB.NET - Provideři, řazení a seskupování

V minulé lekci, LINQ ve VB.NET - Anonymní typy, jsme se naučili deklarovat anonymní typy.

V dnešním LINQ tutoriálu pro VB.NET si popíšeme LINQ providery a začneme s popisem syntaxe LINQ pro řazení a seskupování.

Na dotazy použijeme cvičná data z přiloženého archivu.

Provideři

LINQ funguje díky tzv. providerům. To jsou implementace metod pro různé platformy, aby na nich bylo možné volat LINQ dotazy. Vyjmenujme si základní providery pro LINQ a ke každému si něco málo řekneme.

Provideři v .NET

Některé providery dodává Microsoft přímo v .NET frameworku, nás budou zajímat zejména následující:

  • LINQ to Objects - Provider umožňuje klást dotazy nad základními kolekcemi. Používali jsme ho pro dotazy nad polem, stejně tak se můžeme dotazovat nad kolekcí List a dalšími kolekcemi z .NETu. LINQ to Objects tedy pracuje s daty v operační paměti.
  • LINQ to SQL/LINQ to Entities - Provider mapuje LINQ příkazy na SQL dotazy a umožňuje nám pracovat s MS-SQL databází. Provider nám poskytuje tzv. ORM (Object-relation mapping). Práce s databází je plně objektová, v kurzech budeme často pracovat s providerem LINQ to Entities, LINQ to SQL je jeho předchůdce. Linq to Entities je součástí tzv. Entity frameworku, což je poměrně rozsáhlá knihovna pro práci s relačními (databázovými) daty.
  • LINQ to XML - Provider umožňuje dotazy nad XML souborem. Stejně jako u LINQ to SQL se jedná o objektový přístup.

Provideři třetích stran

Jelikož je samozřejmě možné napsat si provider vlastní, mnoho hotových řešení existuje i od třetích stran. Nicméně, některé z nich nejsou příliš dobře podporovány a je velmi dobrý nápad držet se spíše Microsoft technologií.

  • DbLinq - Nejpoužívanější provider třetí strany, který umožňuje používat technologii LINQ na databázích MySQL, SQLite, Oracle, Postgre SQL, Firebird a dalších velmi používaných databázových platformách.
  • LINQ to Excel - Provider umožňuje pracovat s Excelovou tabulkou (Excelovým dokumentem) jako s databází.
  • LINQ to JSON - Provider pro dotazování nad soubory formátu JSON.
  • LINQ to Amazon - LINQ to Amazon se často uvádí jako ukázka provideru třetí strany. Pomocí LINQ dotazů můžeme vyhledávat v knihách, které tento internetový obchod nabízí.

Vidíme, že providerů je dostatek a jakmile umíme LINQ používat, není problém ho použít téměř na vše. V dalších kurzech se budeme věnovat LINQ to XML a LINQ to Entities.

Řazení a seskupování

V této lekci jsme si uvedli klíčová slova from, where a select. Než se pustíme do podrobného popisu syntaxe LINQ, ukažme si ještě dva základní operátory Order By a Group By.

Řazení Order By

Pokud chceme výsledky dotazu seřadit, použijeme operátor OrderBy:

Dim dotaz1 = (From o In osoby Where (o.Value.vek > 15) Order By o.Value.prijmeni, o.Value.jmeno
              Select o.Value.vek, Jmeno = o.Value.ToString)

For Each odpoved In dotaz1
    Console.WriteLine(odpoved.vek & " " & odpoved.Jmeno)
Next

Výstup:

Konzolová aplikace
21 Huhulák Lojza
24 Mladá Simona
18 Nová Marie
18 Novák Pepa
24 Nový Josef
54 Stará Julie
21 Vokobere Božka
50 Vykopávková Alice
77 Vykopávková Šárka

Jak již víme, VB si tento dotaz vnitřně přeloží na metody:

Dim dotaz1 As Object = osoby.Where(Function(u) u.Value.vek > 15).OrderBy(Function(u) u.Value.prijmeni).[Select](Function(u) u.Value.ToString)

Všechny klauzule z LINQ mají své metody. Dále si je již nebudeme u ukázek uvádět.

Výchozí směr řazení je od nejmenších hodnot po největší (v dotazu dotaz1 jsme řadili podle příjmení osoby (tedy od A do Z) a dále jména osoby. Pokud chceme řadit opačně, uvedeme klíčové slovo Descending:

Dim dotaz2 = (From o In osoby Where (o.Value.vek > 15) Order By o.Value.prijmeni Descending, o.Value.jmeno
    Select o.Value.vek, celeJmeno = o.Value.ToString)
    For Each odpoved In dotaz2
             Console.WriteLine(odpoved.vek & " " & odpoved.celeJmeno))
    Next

V metodě bychom použili OrderByDescending().

Výstup:

Konzolová aplikace
50 Vykopávková Alice
77 Vykopávková Šárka
21 Vokobere Božka
54 Stará Julie
24 Nový Josef
18 Novák Pepa
18 Nová Marie
24 Mladá Simona
21 Huhulák Lojza

V dotazu dotaz1 jsme mohli použít Ascending, ale není to nutné.

Řadit můžeme i podle více kritérií, jednoduše je oddělíme čárkou, ta první mají přednost.

Seskupování Group By

V dotazech často využíváme seskupování(grou­ping). Můžeme tak jednoduše prvky seskupit podle určitých kritérií. Ukažme si příklad, jak bychom seskupili uživatele do skupin podle jejich věku:

Dim skupiny = From vs In osoby.Values.OrderBy(Function(o) o.vek) Group By vekSkupina = vs.vek Into Count(), Group

Co že jsme to provedli? Vybrali jsme všechny osoby podle věku. Dále jsme je podle věku seskupili do vekSkupina, což je kolekce, která obsahuje vždy uživatele se stejným věkem. Je tam tedy např, skupina 15, skupina 16, 17 atd.

Dále vybíráme jak bude skupina vypadat. Bude obsahovat věk, který vezmeme z klíče skupiny, kterým je věk. Právě podle klíče skupiny seskupujeme. Další vlastností bude počet osob ve skupině a další vlastností skupiny bude kolekce osob. Tam uložíme tu aktuální skupinu osob pro daný věk.

Přejděme k výpisu:

For Each skupina In skupiny
    Console.WriteLine("Věk skupina " & skupina.vekSkupina & " počet " & skupina.Count)
    For Each osoba In skupina.Group
                Console.WriteLine("    " & osoba.ToString)
    Next
Next

Nejprve projdeme všechny skupiny skupiny a pro každou skupinu skupina vypíšeme její věk vekSkupina, počet uživatelů a poté samotné uživatele v ní obsažené.

Dotaz vybere:

Konzolová aplikace
Věk skupina 13 počet 1
    Marek Jan
Věk skupina 14 počet 1
    Krásná Mařena
Věk skupina 18 počet 2
    Novák Pepa
    Nová Marie
Věk skupina 21 počet 2
    Huhulák Lojza
    Vokobere Božka
Věk skupina 24 počet 2
    Nový Josef
    Mladá Simona
Věk skupina 50 počet 1
    Vykopávková Alice
Věk skupina 54 počet 1
    Stará Julie
Věk skupina 77 počet 1
    Vykopávková Šárka

V následujícím kvízu, Kvíz - Slovníky, množiny, fronta, zásobník ve VB.NET Kolekce, si vyzkoušíme nabyté zkušenosti z předchozích lekcí.


 

Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.

Stáhnout

Stažením následujícího souboru souhlasíš s licenčními podmínkami

Staženo 6x (47.01 kB)
Aplikace je včetně zdrojových kódů v jazyce VB

 

Předchozí článek
LINQ ve VB.NET - Anonymní typy
Všechny články v sekci
Kolekce a LINQ ve VB.NET
Přeskočit článek
(nedoporučujeme)
Kvíz - Slovníky, množiny, fronta, zásobník ve VB.NET Kolekce
Článek pro vás napsal Přemysl Šíma
Avatar
Uživatelské hodnocení:
Ještě nikdo nehodnotil, buď první!
APSima
Aktivity