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