9. diel - LINQ vo VB.NET - Anonymné typy
V minulej lekcii, LINQ vo VB .NET - Revolúcia v dopytovaní , sme si uviedli technológiu LINQ a vytvorili svoju prvú jednoduchú otázku.
V dnešnom LINQ tutoriále pre VB.NET sa naučíme deklarovať anonymné typy.
Aby sme mohli vytvárať zložitejšie otázky, presnejšie dostať z dotazu len tú časť dát, ktorá nás zaujíma, budeme používať tzv. anonymné typy. Anonymný typ sa chová ako inštancia triedy, ale žiadnu triedu na tento účel deklarovať nemusíme. Skúsme si to:
Dim anonym = New With {.Jmeno = "Anonym", .Prijmeni = "Anonymný", .Vek = 18} Console.WriteLine(anonym.Jmeno) Console.WriteLine(anonym.Prijmeni) Console.WriteLine(anonym.Vek)
Výstup takého programu bude nasledujúci:
Konzolová aplikácia
Anonym
Anonymný
18
Vytvorili sme si anonymný dátový typ, ktorý má v sebe 3
atribúty. Do nich sme rovno uložili hodnoty a celú štruktúru vložili do
premennej anonym
. Visual Basic podporuje anonymné typy, ktoré
umožňujú vytvárať objekty bez písania definície
triedy pre dátový typ.
Namiesto toho kompilátor vygeneruje triedu za nás. Trieda nemá žiadny
použiteľný názov, dedí priamo z triedy Object
a obsahuje
vlastnosti, ktoré zadáme v deklarácii objektu. Vzhľadom na
to, že názov dátového typu nie je zadaný, je označovaný ako anonymný
typ.
Na čo je výhoda takýchto typov? V dotazoch si môžeme v dotaze
select
namapovať úplne čo chceme.
Pre ďalšie príklady si vytvoríme cvičné dáta:
' definujeme potrebné triedy Private Class osoba Public Property jmeno As String Public Property prijmeni As String Public Property vek As UInteger Public Sub New(nJmeno As String, nPrijmeni As String, nVek As Integer) jmeno = nJmeno prijmeni = nPrijmeni vek = nVek End Sub Public Overrides Function ToString() As String Return prijmeni + " " + jmeno End Function End Class Private Class auto Public Property spz As String Public Property barva As String Public Property ridic As osoba End Class ' vytvoríme si dáta :-) Dim osoby = New Dictionary(Of Integer, osoba) ' kľúč je číslo, treba rodné - to by malo byť jedinečné osoby.Add(0, New osoba("Pepa", "Novák", "18")) osoby.Add(1, New osoba("Lojza", "Huhulák", "19")) osoby.Add(2, New osoba("Mařena", "Krásná", "14")) osoby.Add(3, New osoba("Božka", "Vokobere", "21")) osoby.Add(4, New osoba("Josef", "Nový", "24")) osoby.Add(5, New osoba("Jan", "Marek", "13")) osoby.Add(6, New osoba("Marie", "Nová", "18")) osoby.Add(7, New osoba("Simona", "Mladá", "24")) osoby.Add(8, New osoba("Julie", "Stará", "54")) osoby.Add(9, New osoba("Šárka", "Vykopávková", "77")) osoby.Add(10, New osoba("Alice", "Vykopávková", "50")) Dim auta = New List(Of auto) ' autá s ich vlastníkmi/vodičmi auta.Add(New auto With {.spz = "123456", .barva = "červená", .ridic = osoby(0)}) auta.Add(New auto With {.spz = "ABCDEF", .barva = "zelená", .ridic = osoby(1)}) auta.Add(New auto With {.spz = "178910", .barva = "rudá", .ridic = osoby(3)}) auta.Add(New auto With {.spz = "GHIJKL", .barva = "červená", .ridic = osoby(5)}) auta.Add(New auto With {.spz = "zx1234", .barva = "šedá", .ridic = osoby(5)})
Tieto údaje budeme používať vo všetkých ďalších príkladoch.
Vodič je osoba a má na sebe vlastnosti Jmeno
,
Prijmeni
a Vek
. Auto má na sebe vlastnosti
Barva
, Ridic
a Spz
. Napríklad budeme
chcieť vybrať ŠPZ auta a celé meno jeho
vodiča u červených áut. Otázka by
vyzerala takto:
Dim dotaz = (From a In auta Where (a.barva = "červená") Select a.spz, JmenoRidice = a.osoba.jmeno + " " + a.osoba.prijmeni)
Kód pre vypísanie obsahu premennej dotaz
:
For Each vybRid In dotaz With vybRid Console.WriteLine(.spz & " " & .JmenoRidice) End With Next
Výstup:
Konzolová aplikácia
123456 Novák Pepa
GHIJKL Marek Jan
Aby nám dotaz mohol vrátiť takto zložitý výsledok, musíme si naň
vytvoriť práve anonymný dátový typ. Výsledok dotazu bude teda
kolekcia prvkov, kde každý prvok bude mať vlastnosti
Spz
a JmenoRidice
. Všimnime si, že sme raz napísali
len a.Spz
a druhýkrát JmenoRidice = ....
Ak chceme
vložiť už nejakú existujúcu vlastnosť s rovnakým
názvom, stačí uviesť iba tú. Ak chceme názov
iný, musíme použiť
NazevVlastnosti = hodnota
.
Pozor: Anonymnými typmi by sme mali šetriť. Ide o funkcionalitu vytvorenú na určité účely, najmä do LINQ otázok. Anonymné typy nepoužívame v bežnom programovaní namiesto tried, pretože by sme znížili kvalitu zdrojového kódu aj výsledné aplikácie.
Atribúty anonymných typov sú len na čítanie, presnejšie sa jedná o vlastnosti. Väčšinou sa chceme anonymným typom vyhnúť a radšej navrhneme dátovú vrstvu aplikácie tak, aby sme nemuseli písať príliš zložité otázky. Použitím anonymných typov sa zbavujeme relácií medzi jednotlivými entitami, čo môže viesť v zložitejšej aplikácii k mnohým problémom.
Lepšie by sme konkrétnu situáciu mohli riešiť tak, že autu vytvoríme
vlastnosť JmenoRidice
av dotaze select
vyberieme
celé auto, teda jednoducho select a
. Meno vodiča si potom
vytiahneme rovnako jednoducho, ako s anonymným typom. Zároveň pracujeme s
celým autom vrátane všetkých väzieb a nie s nejakou neidentifikovateľnou
anonymnou entitou. Rovnako ale majú anonymné typy svoje miesto pre
zložitejšie, najmä jednoúčelové otázky
a budú sa často objavovať v ukážkových dotazoch v týchto
tutoriáloch.
Už vieme všetko potrebné na to, aby sme si ukázali syntax pokročilejších otázok.
V budúcej lekcii, LINQ vo VB.NET - Provideri, radenie a zoskupovanie , si popíšeme LINQ providerov a začneme s popisom syntaxe LINQ pre radenie a zoskupovanie.
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é 7x (42.76 kB)
Aplikácia je vrátane zdrojových kódov v jazyku VB