Søg på DotNyt:
Denne blog er flyttet til www.nielsbrinch.com


søndag den 6. april 2008

Introduktion til LINQ

skrevet af Niels Brinch


Jeg har været på et 2-timers kursus i LINQ og er efterfølgende begyndt at bygge en lille webapplikation som anvender LINQ. I dette indlæg vil jeg gerne dele de første erfaringer med andre.


Hvad skal jeg bruge LINQ til?

Det er et redskab til lettere at tilgå data i din database. Der er normalt en masse kedeligt manuelt arbejde når man skal tilgå en database. Det kan undgås med LINQ.

Hvis du gerne vil have en liste med dine bruger-objekter, kan du skrive følgende:

List<User> users = 
(from u in db.Users
where u.IsDeleted == false
orderby u.CreatedDate descending
select u).ToList();

Ovenstående skrives med intellisense og det hele. Kolonnerne i din database er typestærke! Så det kan ikke diskuteres at det er både nemt og hurtigt.


Hvordan kommer jeg i gang?


1. Åbn Visual Studio 2008.
2. Tilføj en .dbml-fil til projektet. (Den Item hedder "LINQ to SQL Classes")
3. Åbn din SQL Server 2005 database gennem Server Explorer og træk alle tabellerne over i den åbne .dbml-fil.


Nu er du i gang, klar til at bruge LINQ i din applikation. Det fungerer bedst hvis dine tabeller og kolonner er godt navngivet og på engelsk - men det er ikke et krav.



Hvordan bruger jeg det?


Hvis du kaldte din .dbml-fil for "DB", skal du lave en instans af "DBDataContext" for at få adgang til din database.


DBDataContext db = new DBDataContext();


Den kan også tage en SqlConnection eller en connectionString. Det er nok vejen frem, da den ellers bare benytter den database du åbnede i Server Explorer.


Herefter kan du anvende db-objektet til at skrive queries som den øverst i dette indlæg.



Indsæt nyt element


Desuden er det enormt let at indsætte nye elementer i databasen. Det kan gøres på to måder:


1. Tilføj objektet til den liste du har hentet med din query, og kør db.SubmitChanges();
2. Tilføj objektet til db.Users.InsertOnSubmit(user), og kør db.SubmitChanges();



Hent elementer med paging


Der er et væld af andre muligheder i LINQ queries, men det er lidt for meget til at dække det i dette indlæg. Men herunder er et eksempel på, at man kan man skrive paging direkte ind i en LINQ query.


List<User> users = 
(from u in db.Users
where u.IsDeleted == false
orderby u.CreatedDate descending
select u).Skip(40).Take(10).ToList();

(lad mig vide hvis der er compile-fejl i ovenstående - jeg har ikke en compiler ved hånden pt.)



Problemer


Da jeg startede med LINQ regnede jeg selvfølgelig med at det var perfekt. Det er det ikke. Jeg er allerede blevet opmærksom på en række problemer, og der er sikkert flere.


Performance
Performance KAN være lige så god som hvis man selv skriver sql til databasen, fordi LINQ bliver faktisk oversat til rigtig sql inden det anvendes. Men man skal vide hvad man gør! Man kan sagtens arrangere sin LINQ på en måde som virker, men som bliver katastrofal for performance. I de tilfælde er man nødt til at vende tilbage til almindelig SQL.


Dynamisk indhold af queries
I klassisk sql kan jeg let justere sorteringen ved ganske enkelt at udskifte det kolonne-navn jeg vil sortere på i min tekst-baserede query. Det er let, men det er ikke let i LINQ. I dette indlæg, som jeg har oprettet på Experts Exchange er det også tydeligt at de work-arounds der findes til dette, ikke er særligt gode.


Mange-til-mange relationer
LINQ understøtter ganske enkelt ikke mange-til-mange relationer. I de tilfælde hvor man skal bruge det, er man nødt til at skrive sin SQL i hånden. Også her findes nogle work-arounds, men dem er der enorme performance-omkostninger ved.



Understøttelse af SQL


Ovenstående problemer med LINQ gør faktisk ikke så meget! Man kan stadig få stor udnytte af LINQ i de situationer hvor man er nødt til at skrive din egen SQL. Det er nemlig muligt at eksekvere en query og direkte få en typestærk liste af objekter ud som resultat.


string query = @"
SELECT Users.UserName, Users.CreatedDate, Users.IsDeleted ...
FROM Users
"


List<User> users = db.ExecuteQuery(typeof(User), query);

Nemmere kan det ikke være. Og hvad mere er - ovenstående genvej er performance-mæssigt forsvarligt.



Konklusion


LINQ er uperfekt men stadig så tidsbesparende, både på kort og langt sigt, at jeg klart vil anbefale at anvende det i nye projekter.

0 kommentarer

0 Kommentarer:

Send en kommentar

<< Tilbage


 
Til forsiden

Niels Brinch