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