Black Friday je tu! Využij jedinečnou příležitost a získej až 80 % znalostí navíc zdarma! Více zde
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í.
BF extended 2022

Lekce 9 - LINQ ve VB.NET - Anonymní typy

V minulé lekci, LINQ ve VB.NET - Revoluce v dotazování, jsme si uvedli technologii LINQ a vytvořili svůj první jednoduchý dotaz.

V dnešním LINQ tutoriálu pro VB.NET se naučíme deklarovat anonymní typy.

Abychom mohli vytvářet složitější dotazy, přesněji dostat z dotazu jen tu část dat, která nás zajímá, budeme používat tzv. anonymní typy. Anonymní typ se chová jako instance třídy, ale žádnou třídu k tomuto účelu deklarovat nemusíme. Zkusme 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 takového programu bude následující:

Konzolová aplikace
Anonym
Anonymní
18

Vytvořili jsme si anonymní datový typ, který má v sobě 3 atributy. Do nich jsme rovnou uložili hodnoty a celou strukturu vložili do proměnné anonym. Visual Basic podporuje anonymní typy, které umožňují vytvářet objekty bez psaní definice třídy pro datový typ.

Místo toho kompilátor vygeneruje třídu za nás. Třída nemá žádný použitelný název, dědí přímo ze třídy Object a obsahuje vlastnosti, které zadáme v deklaraci objektu. Vzhledem k tomu, že název datového typu není zadán, je označován jako anonymní typ.

K čemu je výhoda takových typů? V dotazech si můžeme v dotazu select namapovat úplně co chceme.

Pro další příklady si vytvoříme cvičná data:

'definujeme potřebné třídy
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

Sub Main()
    'vytvoříme si data :-)
    Dim osoby = New Dictionary(Of Integer, osoba) 'klíč je číslo, třeba rodné - to by mělo být 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) 'auta s jejich vlastníky/řidiči
    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)})
End Sub

Tato data budeme používat ve všech dalších příkladech.

Řidič je osoba a má na sobě vlastnosti Jmeno, Prijmeni a Vek. Auto má na sobě vlastnosti Barva, Ridic a Spz. Například budeme chtít vybrat SPZ auta a celé jméno jeho řidiče u červených aut. Dotaz by vypadal takto:

Dim dotaz = (From a In auta Where (a.barva = "červená")
             Select a.spz, JmenoRidice = a.osoba.jmeno + " " + a.osoba.prijmeni)

Kód pro vypsání obsahu proměnné dotaz:

For Each vybRid In dotaz
    With vybRid
        Console.WriteLine(.spz & " " & .JmenoRidice)
    End With
Next

Výstup:

Konzolová aplikace
123456 Novák Pepa
GHIJKL Marek Jan

Aby nám dotaz mohl vrátit takto složitý výsledek, musíme si na něj vytvořit právě anonymní datový typ. Výsledek dotazu bude tedy kolekce prvků, kde každý prvek bude mít vlastnosti Spz a JmenoRidice. Všimněme si, že jsme jednou napsali jen a.Spz a podruhé JmenoRidice = .... Pokud chceme vložit již nějakou existující vlastnost se stejným názvem, stačí uvést pouze tu. Pokud chceme název jiný, musíme použít NazevVlastnosti = hodnota.

Pozor: Anonymními typy bychom měli šetřit. Jedná se o funkcionalitu vytvořenou pro určité účely, zejména do LINQ dotazů. Anonymní typy nepoužíváme v běžném programování namísto tříd, protože bychom snížili kvalitu zdrojového kódu i výsledné aplikace.

Atributy anonymních typů jsou jen pro čtení, přesněji se jedná o vlastnosti. Většinou se chceme anonymním typům vyhnout a raději navrhneme datovou vrstvu aplikace tak, abychom nemuseli psát příliš složité dotazy. Použitím anonymních typů se zbavujeme relací mezi jednotlivými entitami, což může vést ve složitější aplikaci k mnoha problémům.

Lépe bychom konkrétní situaci mohli řešit tak, že autu vytvoříme vlastnost JmenoRidice a v dotazu Select vybereme celé auto, tedy jednoduše Select a. Jméno řidiče si poté vytáhneme stejně jednoduše jako s anonymním typem. Zároveň pracujeme s celým autem včetně všech vazeb a ne s nějakou neidentifikova­telnou anonymní entitou. Stejně tak ale mají anonymní typy své místo pro složitější, zejména jednoúčelové dotazy a budou se často objevovat v ukázkových dotazech v těchto tutoriálech.

Již umíme vše potřebné k tomu, abychom si ukázali syntaxi pokročilejších dotazů.

V příští lekci, LINQ ve VB.NET - Provideři, řazení a seskupování, si popíšeme LINQ providery a začneme s popisem syntaxe LINQ pro řazení a seskupování.


 

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 (42.76 kB)
Aplikace je včetně zdrojových kódů v jazyce VB

 

Předchozí článek
LINQ ve VB.NET - Revoluce v dotazování
Všechny články v sekci
Kolekce a LINQ v VB.NET
Přeskočit článek
(nedoporučujeme)
LINQ ve VB.NET - Provideři, řazení a seskupování
Článek pro vás napsal Přemysl Šíma
Avatar
Uživatelské hodnocení:
Ještě nikdo nehodnotil, buď první!
APSima
Aktivity

 

 

Komentáře

Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zatím nikdo nevložil komentář - buď první!