2009-05-22 17 views
11

Mi viene passato un set di parametri di querystring all'interno di una classe Parameters con cui interrogare un database di immagini. Ad ogni chiamata alcuni parametri possono essere nulli. Quindi in sql vorrei creare la query comeCome creare una clausola da Linq a Sql dove bit a bit?

if (parameters.Value1 != null) 
{ 
    sql.Append("sql_where_clause"); 
} 

if (parameters.Value2 != null) 
{ 
    sql.Append("sql_where_clause"); 
} 

Come faccio a fare lo stesso con Linq?

risposta

11

facile, IQueryable non viene valutato finché non si enumera, quindi è sufficiente continuare a contrassegnare le clausole.

if (parameters.Value1 != null) 
{ 
    results = results.Where(x => <some condition>); 
} 

if (parameters.Value2 != null) 
{ 
    results = results.Where(x => <some other condition>); 
} 
+6

Nota che questo funziona davvero solo per 'predicati AND'ing. –

+0

Funzionerà quando si utilizza Skip and Take? –

13

Il modo migliore per costruire dinamicamente Where-clausole è quello di utilizzare la meravigliosa Albahari PredicateBuilder.

È possibile utilizzarlo per creare espressioni where-clause contenenti OR e AND. Supporto linguistico integrato per questo è stato originariamente destinato ma didn't quite make in C# 3.

Ad esempio:

var whereClause = PredicateBuilder.False<Customer>(); 

if (parameters.Value1 != null) 
{ 
    whereClause = whereClause.Or(customer => customer.City == parameters.Value1); 
} 

var query = db.Customers.Where(whereClause); 
+0

Questo ha reso/salvato la mia giornata. Grazie. E stavo pensando che non ho ancora Linq per SQL, come ho appena iniziato ad usarlo ... ma ahimè il link sopra a PredicateBuilder è stato fantastico! :) Questo sicuramente è qualcosa che dovrebbe essere lì ?? – Brian