Dynamicweb modul-udvikling med LINQ

Efterhånden bruger jeg LINQ i al min udvikling og jeg synes også det vinder mere og mere indpas i  min modul-udvikling til Dynamicweb. Og jeg vil her kort ind på hvad er LINQ er og give nogle eksempler og også lidt ind på hvorfor det er så dejligt at arbejde med.

Introduktion til LINQ

Lige for de som ikke lige har helt styr på hvad LINQ er så er det kort fortalt en sprog-udvidelse til til kunne udtrykke SQL lignende kode.

Her fx i C# trækker vi en liste af medarbejdere ud af en database tabel.

/// CODE BLOCK 1
IDbConnection
dwCon = Dynamicweb.Database.GetConn("Dynamicweb.mdb"); List<DB.Medarbejdere> objMedarbejdere = new List<DB.Medarbejdere>(); using (DB.DynamicwebDataContext db = new DB.DynamicwebDataContext(dwCon)) { objMedarbejdere = (from m in db.Medarbejderes orderby m.Navn select m).ToList(); }

På almindelig vis skulle man skrive sådan:

/// CODE BLOCK 2
IDbConnection
dwCon = Dynamicweb.Database.GetConn("Dynamicweb.mdb"); List<Medarbejder> objMedarbejdere = new List<Medarbejder>(); using (IDataReader rs = Dynamicweb.Database.getDataReader("SELECT * FROM Medarbejdere ORDER BY Navn")) { while (rs.Read()) { Medarbejder objMedarbejder = new Medarbejder(); objMedarbejder.Id = rs.GetInt32(0); objMedarbejder.Navn = rs.GetString(1); objMedarbejder.Adresse = rs.GetString(2); objMedarbejder.Postnr = rs.GetString(3); objMedarbejder.Bynavn = rs.GetString(4); objMedarbejder.Land = rs.GetString(5); objMedarbejdere.Add(objMedarbejder); } }


Forinden skulle vi naturligvis have skrevet vores Medarbejder-klasse. Vi kan hurtig samle Medarbejder-objekter i en liste ved hjælp af generiske typer, meni det store hele er det noget tungt at skrive.

LINQ forærer os et klasse-agtigt interface til vores database og der sparer jeg utrolig meget tid til de måske mange men simple database opgaver i mine projekter.

Hvorfor LINQ er så dejlig at arbejde med

Først fordi du får det her klasse-agtige interface til databasen foræret. Næst efter kommer nok at det er lynhurtigt at foretage ændringer i tabellerne i databasen åbne din DBML-fil og fjerne tabellen og sætte den ind igen og så når man kompilerer koden får man straks alle fejl frem hvor man skal have rettet anvendelsen af denne nye ændring. Jeg skriver dermed en meget mere sikker kode fordi compileren kan fortælle mig om mine fejl og derfor skal jeg ikke køre så meget test og sørge for alt mulig undtagelses-/exception-håndtering.

Har man ikke lige fået sine data i den rækkefølge de skal bruges eller fx når man skal bruge dem i flere rækkefølger og foretage flere filtreringer så er det ikke nødvendigt længere med nye database kald.

I mit eksempel ovenfor hvor jeg trækker en liste af medarbejdere ud af database har jeg sorteret dem på Navn. Hvis jeg lige pludselig skal bruge liste i Postnr orden kan jeg med LINQ bare lige gøre sådan her:

/// CODE BLOCK 3
List
<DB.Medarbejdere> objEfterPostnr = objMedarbejdere.OrderBy(m => m.Postnr).ToList();

Hvis jeg ikke ville have haft min list i en liste kunne jeg bare skrive:

/// CODE BLOCK 4
var
objEfterPostnr = objMedarbejdere.OrderBy(m => m.Postnr);

Hvis jeg så lige skal have et filter på fx landet så jeg kun sortere alle medarbejdere efter Postnr i Danmark skriver vi bare sådan her:

/// CODE BLOCK 5
var
objEfterPostnr = objMedarbejdere.Where(m => m.Land.Equals("Danmark")).OrderBy(m => m.Postnr);

Det er jo meget nemmere – hurtigere og mere sikkert end at skulle skrive "CODE BLOCK 2" hele fire gange.

Jeg kan kun opfordre dig til at prøve om det er noget du kan vende dig til, jeg selv synes det er helt vildt besparende i tid at arbejde med, men det er ikke alt LINQ er godt til fx den dynamiske del af SQL hvor man parameter afhængigt skaber dynamiske SQL-sætning kan ikke lade sig gøre. Det er jo godt rent sikkerhedsmæssigt pga. faren for at man ikke har sikret imod SQL-Injection m.v. Men alligevel kunne det være rart at have nogle redskaber ved hånden som kunne matche den dynamiske del af SQL i programmeringen, måske det kommer.

I Dynamicweb bruger jeg LINQ til 99% af al data behandling til og fra database. LINQ er er også uhyre stærk ifm. opdatering af database fx INSERT, UPDATE, DELETE kommandoer kan gøres uden du skal tænke så meget over det.

Her opdaterer jeg fx navnet på en medarbejder:

/// CODE BLOCK 6
var mig = objMedarbejdere.Where(m => m.Navn.Equals("Kevin Steffer")).Single(); mig.Navn = "Kevin Lind Steffer"; db.SubmitChanges();

Her opretter jeg en ny medarbejder:

/// CODE BLOCK 7
DB.Medarbejdere objMig = new DB.Medarbejdere(); objMig.Navn = "Kevin Steffer"; objMig.Adresse = "Strøget 40"; objMig.Postnr = "7430"; objMig.Bynavn = "Ikast"; objMig.Land = "Danmark"; db.Medarbejderes.InsertOnSubmit(objMig); db.SubmitChanges();

Ikke noget med at jeg skal huske alle mulige sikkerhedstjek ved at køre et traditionelt dynamisk SQL kald mod databasen, det styrer LINQ for mig. Dynamicweb har også funktioner der hjælper med at tjekke værdier som skal ind i et dynamisk SQL kald, men det bliver til rigtig mange kald og jeg kunne nemt overse et.

Så jeg er afgjort hoppet på LINQ vognen og her lidt links til at komme igang

Hooked on LINQ

101 LINQ Samples

En Google

God formøjelse med LINQ

, ,

Skriv et svar

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>