2010-10-14 2 views
8

Vous êtes un peu bloqué à ce sujet. Fondamentalement, j'ai une méthode que je veux retourner une expression de prédicat que je peux utiliser comme une condition Où. Je pense que ce que je dois faire est similaire à ceci: http://msdn.microsoft.com/en-us/library/bb882637.aspx mais je suis un peu coincé quant à ce que je dois faire.Comment construire et renvoyer dynamiquement un prédicat linq basé sur l'entrée de l'utilisateur

Méthode:

private static Expression<Func<Conference, bool>> GetSearchPredicate(string keyword, int? venueId, string month, int year) 
{ 
    if (!String.IsNullOrEmpty(keyword)) 
    { 
     // Want the equivilent of .Where(x => (x.Title.Contains(keyword) || x.Description.Contains(keyword))); 
    } 
    if (venueId.HasValue) 
    { 
     // Some other predicate added... 
    } 

    return ?? 

} 

Exemple d'utilisation:

var predicate = GetSearchPreducate(a,b,c,d); 
var x = Conferences.All().Where(predicate); 

j'ai besoin de cette séparation pour que je puisse passer mon prédicats dans mon dépôt et de l'utiliser dans d'autres endroits.

Répondre

8

Avez-vous vérifié PredicateBuilder

+1

Nice, fait exactement ce que je veux :) –

10

Un prédicat est uniquement une fonction qui renvoie une valeur booléenne.

Je ne peux pas le tester, maintenant, mais cela ne fonctionnerait-il pas?

private static Expression<Func<Conference, bool>> GetSearchPredicate(string keyword, int? venueId, string month, int year) 
{ 
    if (!String.IsNullOrEmpty(keyword)) 
    { 
     //return a filtering fonction 
     return (conf)=> conf.Title.Contains(keyword) || Description.Contains(keyword))); 
    } 
    if (venueId.HasValue) 
    { 
     // Some other predicate added... 
     return (conf)=> /*something boolean here */; 
    } 

    //no matching predicate, just return a predicate that is always true, to list everything 
    return (conf) => true; 

} 

EDIT: basé sur les commentaires de Matt Si vous voulez composer les délégués, vous pouvez procéder ainsi

private static Expression<Func<Conference, bool>> GetSearchPredicate(string keyword, int? venueId, string month, int year) 
{ 
    Expression<Func<Conference, bool> keywordPred = (conf) => true; 
    Expression<Func<Conference, bool> venuePred = (conf) => true; 
    //and so on ... 


    if (!String.IsNullOrEmpty(keyword)) 
    { 
     //edit the filtering fonction 
     keywordPred = (conf)=> conf.Title.Contains(keyword) || Description.Contains(keyword))); 
    } 
    if (venueId.HasValue) 
    { 
     // Some other predicate added... 
     venuePred = (conf)=> /*something boolean here */; 
    } 

    //return a new predicate based on a combination of those predicates 
    //I group it all with AND, but another method could use OR 
    return (conf) => (keywordPred(conf) && venuePred(conf) /* and do on ...*/); 

} 
+1

Ouais, comme ça. Extrayez simplement la partie (x => quelque chose) d'où et enregistrez-la dans Expression >. – Euphoric

+0

Acclamations, mais je veux construire sur le filtre/prédicat. Donc, si un mot-clé est transmis, ajoutez le filtre correspondant. Et si un lieu de rendez-vous est également passé, ajoutez le filtre pour cela ... C'est là que tout me confond ... –

+0

Et quand vous utilisez l'expression où vous avez besoin du prédicat, utilisez exp.Compile() – Les

Questions connexes