| 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. |
27/08-2010 10:35 af nanna møller
17/05-2010 15:23 af Jakke
17/08-2009 07:45 af Knobbe
12/08-2009 16:45 af Clæus
11/08-2009 02:49 af Bo
08/07-2009 00:27 af sinætra
14/05-2009 03:22 af Clæaus
02/04-2009 03:28 af lækremichael
26/03-2009 09:44 af Jakke
20/03-2009 02:32 af Jakke