Forsker litt på LINQ for tiden i forbindelse med at jeg skal holde foredrag om det i NNUG.
LINQ er en fantastisk herlig utvidelse av c#. (LINQ = Language INtegrated Query)
Det bringer funksjonalitet fra "Relasjons-verden" inn i den "objektorienterte verden", og gir oss nye muligheter. De viktigste jeg tenker på da er:
- Definere et subset deklarativt
- Gruppering av data med tilhørende aggregatfunksjoner (sum pr ditt og datt osv)
- Typede spørringer gir oss: Kompileringsfeil i stedet for runtime feil + intellisense-hjelp ved programmering.
- Enkelt å oppdatere data.
- Effektiv måte å koble forskjellige datacolleticon (vha join)
LINQ er helt generelt, og brukes på samme måte om det er mot collections i memory, eller mot SQL, eller mot xml. Derfor er LINQ mye mer enn et ORM-verktøy
Her er et liten kodesnutt som jeg synes var fin. Kikk på den tenk på hvordan du måtte laget noe slik uten LINQ. Etablert adapter, eller iterert med foreach-løkke eller....., du tar poenget.
var siste =
from s in database.Brukeraksjon
where
s.Bruker == bruker &&
(s.Maalobjekt == objekt || objekt == "-1")
group s by new {s.Operasjon, s.Maalobjekt} into g
orderby g.Key
select new {Oper = g.Key.Operasjon, Maal = g.Key.Maalobjekt, Maks = g.Max(s => s.ForespTidsp)};
Det kule er nå at queryen er ikke kjørt ennå. LINQ bruker "Lazy evalutation", så det er først når du beviselig trenger å bruke dataene at evalueringen blir gjordt.
Det betyr at jeg nå kan bruke denne spørringen videre inn i en annen query (se "siste" under):
var minePrefs =
(bareSiste) ?
from p in database.Brukeraksjon
from s in siste
where
p.Operasjon == s.Oper &&
p.Maalobjekt == s.Maal &&
p.ForespTidsp == s.Maks &&
p.Bruker == bruker
select p
:
from p in database.Brukeraksjon
where
p.Bruker == bruker
select p
;
Query'en defineres som et expression-tree. Dette blir optimalisert, så i dette eksempelet blir mine to query's kombinert til et mer effektiv query. Kunne jo laget en mer effektiv query selv, men da vil lesbarheten i koden reduseres.
Kommer med mer i neste del... (stay tuned :-) (sett opp rss-feed))