IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
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í.

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 neidentifikova­teľ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

 

Predchádzajúci článok
LINQ vo VB .NET - Revolúcia v dopytovaní
Všetky články v sekcii
Kolekcie a LINQ v VB.NET
Preskočiť článok
(neodporúčame)
LINQ vo VB.NET - Provideri, radenie a zoskupovanie
Článok pre vás napísal Přemysl Šíma
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
APSima
Aktivity