2011-10-15 7 views
1

J'essaie de combiner une sélection multiple avec une fonction lambda dans une expression lambda. Comment je fais ça? Je sais que la dernière ligne est fausse, mais vous donne une idée de ce que je veux dire.Conversion des fonctions Lambda en expression lambda

Func<Event, bool> where = null; 

if (!string.IsNullOrWhiteSpace(searchToken)) 
    where = q => q.Name.ToUpper().Contains(searchToken.ToUpper()); 

where += q => q.Hidden = false; 

Expression<Func<Event, bool>> where1 = q => where; <-- Erroring 
+1

On ne sait pas vraiment ce que vous visez vraiment. Essayez-vous d'effectuer plusieurs filtres? Quelle est la plus grande image? –

+0

La plus grande image est que j'ai une fonction générique qui prend Expression >. J'ai des déclarations conditionnelles que je dois ajouter ou non. J'utilise le Func pour construire mes critères mais je veux l'envoyer à la fonction générique comme Expression >. –

+0

J'ai remarqué quelque chose appelé Expression Builder, mais existe-t-il un moyen par défaut de le faire? –

Répondre

4

Je suppose que vous voulez PredicateBuilder. (La source est disponible sur cette page.) Vous utiliseriez comme ceci:

var predicate = q => !q.Hidden; 
if (!string.IsNullOrWhiteSpace(searchToken)) 
{ 
    predicate = predicate.And(q => q.Name.ToUpper() 
             .Contains(searchToken.ToUpper()); 
} 
return predicate; 

C'est en supposant que vous voulez « et » les conditions - on ne fait que ce soit clair ...

Notez que c'est pas un bon moyen de comparer d'une manière insensible à la casse, soit. Si vous pouviez nous dire ce qui allait consommer la requête (par exemple, LINQ to SQL, LINQ to EF), nous pourrions suggérer une manière compatible avec le fournisseur d'effectuer une requête insensible à la casse.

+0

Qu'est-ce que var predicate = q =>! Q.Hidden ;? Est-ce une expression de Func? –

+0

@MikeFlynn: Cela ne serait pas compilé - vous ne pouvez pas utiliser l'affectation d'une expression lambda à une variable implicitement typée. Vous pouvez avoir 'Expression > prédicat = q =>! Q.Hidden;' ou 'Func prédicat = q =>! Q.Hidden;'. Le premier vous donnera un arbre d'expression, le dernier un délégué. –

0

Regardez http://msdn.microsoft.com/en-us/library/bb882637.aspx. Comment utiliser les arborescences d'expression pour créer des requêtes dynamiques En cas d'utilisation de l'expression <> comme si l'expression devait être connue au moment de la compilation, car le compilateur construit alors la syntaxe AST abstraite trois et la stocke comme donnée dans votre instance Expression <>.