2009-05-22 5 views
11

On me passe un ensemble de paramètres de chaîne de requête dans une classe Parameters avec laquelle interroger une base de données d'images. Avec chaque appel, certains paramètres peuvent être null. Donc, en sql je construirais la requête commeComment construire une clause Linq to Sql où bit par bit?

Comment faire la même chose avec Linq?

Répondre

11

facile, les IQueryables ne sont pas évalués jusqu'à ce que vous énumériez, donc gardez simplement le balisage sur où les clauses.

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

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

Notez que cela ne fonctionne vraiment pour 'AND'ing prédicats. –

+0

Est-ce que cela fonctionnera avec Skip and Take? –

13

La meilleure façon de construire dynamiquement où des clauses-est d'utiliser le merveilleux Albahari PredicateBuilder.

Vous pouvez l'utiliser pour créer des expressions where-clause contenant OR ainsi que AND. Le soutien linguistique intégré pour c'était initialement prévu, mais didn't quite make dans C# 3.

Par exemple:

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

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

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

Cela a fait/sauvé ma journée. Merci. Et je pensais que je n'avais tout simplement pas Linq à sql, comme je viens de commencer à l'utiliser .. mais hélas le lien ci-dessus à PredicateBuilder était génial! :) Ceci est certainement quelque chose qui devrait être là? – Brian