IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

10. diel - LINQ vo VB.NET - Provideri, radenie a zoskupovanie

V minulej lekcii, LINQ vo VB.NET - Anonymné typy , sme sa naučili deklarovať anonymné typy.

V dnešnom LINQ tutoriále pre VB.NET si popíšeme LINQ providerov a začneme s popisom syntaxe LINQ pre radenie a zoskupovanie.

Na otázky použijeme cvičné dáta z priloženého archívu.

Provideri

LINQ funguje vďaka tzv. providerom. To sú implementácie metód pre rôzne platformy, aby na nich bolo možné volať LINQ dotazy. Vymenujme si základné providery pre LINQ a ku každému si niečo málo povieme.

Provideri v .NET

Niektoré providery dodáva Microsoft priamo v .NET frameworku, nás budú zaujímať najmä nasledujúce:
  • LINQ to Objects - Provider umožňuje klásť otázky nad základnými kolekciami. Používali sme ho na otázky nad poľom, rovnako tak sa môžeme pýtať nad kolekciou List a ďalšími kolekciami z .NETu. LINQ to Objects teda pracuje s dátami v operačnej pamäti.
  • LINQ to SQL/LINQ to Entities - Provider mapuje LINQ príkazy na SQL dotazy a umožňuje nám pracovať s MS-SQL databázou. Provider nám poskytuje tzv. ORM (Object-relation mapping). Práca s databázou je plne objektová, v kurzoch budeme často pracovať s providerom LINQ to Entities, LINQ to SQL je jeho predchodca. Linq to Entities je súčasťou tzv. Entity frameworku, čo je pomerne rozsiahla knižnica na prácu s relačnými (databázovými) dátami.
  • LINQ to XML - Provider umožňuje otázky nad XML súborom. Rovnako ako pri LINQ to SQL ide o objektový prístup.

Provideri tretích strán

Keďže je samozrejme možné napísať si provider vlastný, mnoho hotových riešení existuje aj od tretích strán. Avšak, niektoré z nich nie sú príliš dobre podporované a je veľmi dobrý nápad držať sa skôr Microsoft technológií.
  • DbLinq - Najpoužívanejší provider tretej strany, ktorý umožňuje používať technológiu LINQ na databázach MySQL, SQLite, Oracle, Postgre SQL, Firebird a ďalších veľmi používaných databázových platformách.
  • LINQ to Excel - Provider umožňuje pracovať s Excelovou tabuľkou (Excelovým dokumentom) ako s databázou.
  • LINQ to JSON - Provider pre dotazovanie nad súbormi formátu JSON.
  • LINQ to Amazon - LINQ to Amazon sa často uvádza ako ukážka providera tretej strany. Pomocou LINQ dotazov môžeme vyhľadávať v knihách, ktoré tento internetový obchod ponúka.

Vidíme, že providerov je dostatok a akonáhle vieme LINQ používať, nie je problém ho použiť takmer na všetko. V ďalších kurzoch sa budeme venovať LINQ to XML a LINQ to Entities.

Radenie a zoskupovanie

V tejto lekcii sme si uviedli kľúčové slová from, where a select. Než sa pustíme do podrobného popisu syntaxe LINQ, ukážme si ešte dvoch základných operátorov Order By a Group By.

Radenie Order By

Pokiaľ chceme výsledky dotazu zoradiť, 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á aplikácia
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

Ako už vieme, VB si túto otázku vnútorne preloží na metódy:

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šetky klauzuly z LINQ majú svoje metódy. Ďalej si ich už nebudeme pri ukážkach uvádzať.

Predvolený smer radenia je od najmenších hodnôt po najväčší (v dotaze dotaz1 sme radili podľa priezviska osoby (teda od A do Z) a ďalej mená osoby. Ak chceme radiť opačne, uvedieme kľúč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 metóde by sme použili OrderByDescending().

Výstup:

Konzolová aplikácia
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 dotaze dotaz1 sme mohli použiť Ascending, ale nie je to nutné.

Radiť môžeme aj podľa viacerých kritérií, jednoducho ich oddelíme čiarkou, tie prvé majú prednosť.

Zoskupovanie Group By

V otázkach často využívame zoskupovanie (grouping). Môžeme tak jednoducho prvky zoskupiť podľa určitých kritérií. Ukážme si príklad, ako by sme zoskupili užívateľov do skupín podľa ich veku:
Dim skupiny = From vs In osoby.Values.OrderBy(Function(o) o.vek) Group By vekSkupina = vs.vek Into Count(), Group

Čo že sme to urobili? Vybrali sme všetky osoby podľa veku. Ďalej sme ich podľa veku zoskupili do vekSkupina, čo je kolekcia, ktorá obsahuje vždy užívateľov s rovnakým vekom. Je tam teda napr. skupina 15, skupina 16, 17 atď.

Ďalej vyberáme ako bude skupina vyzerať. Bude obsahovať vek, ktorý vezmeme z kľúča skupiny, ktorým je vek. Práve podľa kľúča skupiny zoskupujeme. Ďalšou vlastnosťou bude počet osôb v skupine a ďalšou vlastnosťou skupiny bude kolekcia osôb. Tam uložíme tú aktuálnu skupinu osôb pre daný vek.

Prejdime 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

Najprv prejdeme všetky skupiny skupiny a pre každú skupinu skupina vypíšeme jej vek vek vekSkupina, počet užívateľov a potom samotných užívateľov v nej obsiahnutých.

Otázka vyberie:

Konzolová aplikácia
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 budúcej lekcii, LINQ - Reštrikčné, Projekčné operátory a Rozdeľujúce operácie , si popíšeme LINQ operátorov reštrikčné a projekčné, a tiež rozdeľujúce operácie.


 

Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.

Stiahnuť

Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

Stiahnuté 6x (47.01 kB)
Aplikácia je vrátane zdrojových kódov v jazyku VB

 

Predchádzajúci článok
LINQ vo VB.NET - Anonymné typy
Všetky články v sekcii
Kolekcie a LINQ v VB.NET
Preskočiť článok
(neodporúčame)
LINQ - Reštrikčné, Projekčné operátory a Rozdeľujúce operácie
Článok pre vás napísal Přemysl Šíma
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
APSima
Aktivity