iTrond.net

[aiTrond dått nett] --> .NET, seiling, roboter og annen morro!
Velkommen til iTrond.net Sign in | Join | Help
in Search

Trond

LINQ del 1 av ...

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))

 

 

Published 10. januar 2007 18:27 by Trond
Filed under: , , ,

Comment Notification

If you would like to receive an email when updates are made to this post, please register here

Subscribe to this post's comments using RSS

Comments

 

Torbjørn Marø said:

Hei Trond

Tenkte bare jeg skulle si fra at jeg trengte å sjekke noe LINQ syntax i dag og brukte da selvsagt google.., og endte opp her. Først etter at jeg hadde funnet det jeg trengte oppdaget jeg at det var din blogg. La ikke merke til at den var på norsk engang før nå :)

januar 8, 2008 11:56

Leave a Comment

(required) 
(optional)
(required) 
Submit
Powered by Community Server, by Telligent Systems