sinatra.dk
Arkiv, rss + Admin
 
Dynamisk SQL i LINQ
3 Kommentarer | 02/08-2008 02:05 sinatra
Enhver der har bygget en kompleks søgeformular, kender rutinen med at tjekke indholdet af forskellige kontroller, og generere SQL derefter. Det er både klamt og effektivt.

Kode a'la:

  string sql = "select .... ";
  if (_textFieldA.text != null) 
    sql .= " and mytable.A = "._textFieldA.text ";
LINQs facon er jo anderledes. Eftersom man skriver forespørgslen direkte i kode, kan man ikke stykke den sammen så enkelt. Det kan man dog alligevel. Man skal bare bygge sin IQueryable<T> op stykke for stykke ved hjælp af de bagvedliggende extensionmethods.

IQueryable<t> q  = _datacontext.ts;
if (_textFieldA.text != null)
  q = q.Where(t => t.A == _textFieldA.text);
Eneste problem jeg indtil videre ikke har fundet en god løsning på er sortering. I traditionel SQL tilføjer man lidt tekst:
sql .= " order by ".orderbyString;
Men i LINQ? Man er desværre nødt til at skrive:
if (orderbyString == "fieldname")
  q = q.OrderBy(t => t.fieldname); 
Altså kode istedet for tekst. Jeg kan ikke umiddelbart se en let vej igennem her. Kan nogen? Jeg har ikke forsøgt mig med reflektionsvejen, men det virker umiddelbart som en mulighed, dog ikke særlig elegant og LINQish.

Jeg har en meget kompleks søgeformular jeg skal have powered med LINQ. Jeg er spændt på om jeg kan komme hele vejen. Der er både aggregat-funcs, group bys, and-or-logik, case when og ultra-dynamisk sortering a'la:

Order by (Select Name from Error ...) 
Så det bliver en mundfuld. Jeg satser på at fortælle om erfaringerne.
 

1) 02/08-2008 06:32 Clæus (89.150.74.120)
Jeg kan ikke helt forstå anvendelsen af ordet desværre ovenfor. Hvorfor er det "desværre" ?

 
2) 02/08-2008 06:56 sinætra (195.215.90.138)
Desværre, fordi linq-versionen er mindre dynamisk en sql-versionen.

I SQL-udgaven er den ene linie nok til at styre f.eks. sortering efter forskellige kolonner i et grid. Men i LINQ skal man oversætte fra kolonnenavn til lambda-funktion, og umiddelbart mener jeg at man må ty til reflektion eller en if (... = "kolonnenavn" ) pr. kolonne.

Og det er da mindre fikst og mindre elegant end sql-varianten.
 
3) 02/08-2008 13:06 Carsten (82.143.235.20)
Men det er jo netop den "dynamik" der åbner for sql-injection og generelt rådden kode ... det er lidt som når folk tuder over at stærkt typede sprog ikke giver den samme frihed som etellerandet svagt typet (det er af uransalige årsager ofte c-hackere der flæber over den slags).

I stedet for at kigge på den mistede "frihed", bør du da netop fokusere på alt det der bare virker, og virker ordentligt i modsætning til de aldrig helt gode lappeløsninger man altid har måttet ty til for at binde kode med database.

Men vi bør også huske på at tiltag som LINQ-to-SQL kun er en mellemstation mens vi venter på helstøbt OR-mapping, for det er altså stadig målet - og at sammenligne med garbage-collection i forhold til direkte memory-allokering - begge har bestemt sine anvendelsesområder, men som oftest giver det bare bedre software at lade frameworket håndtere de trælse detaljer.
 
Af:
Barselsbilleder
www.flickr.com

Nyeste kommentarer
Hjælp... digt/rim til min kæreste....(18)
27/08-2010 10:35 af nanna møller
Rock og gobeliner(5)
17/05-2010 15:23 af Jakke
tv-lørdag(1)
17/08-2009 07:45 af Knobbe
Goodbye pork pie hat(1)
12/08-2009 16:45 af Clæus
Play some rap-music(5)
11/08-2009 02:49 af Bo
Alene hjemme(2)
08/07-2009 00:27 af sinætra
Tolerance(1)
14/05-2009 03:22 af Clæaus
Spændende(1)
02/04-2009 03:28 af lækremichael
Flæskesvær(3)
26/03-2009 09:44 af Jakke
Hvorfor Brian?(1)
20/03-2009 02:32 af Jakke

Andre blogs

Diverse

Twitter Updates

follow me on Twitter

GeoURL
eXTReMe Tracker

Powered By Site5.com

Sinatra.dk
Sax og samliv