2010-10-14 5 views
8

Ein bisschen feststecken. Grundsätzlich habe ich eine Methode, die ich einen Prädikatausdruck zurückgeben möchte, den ich als eine Where-Bedingung verwenden kann. Ich denke, was ich tun muss, ist ähnlich zu diesem: http://msdn.microsoft.com/en-us/library/bb882637.aspx, aber ich bin ein bisschen fest, was ich tun muss.Wie Sie ein Linq-Prädikat basierend auf Benutzereingaben dynamisch erstellen und zurückgeben können

Methode:

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 ?? 

} 

Verwendungsbeispiel:

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

Ich brauche diese Trennung so, dass ich mein Prädikat in mein Repository passieren kann und es in anderen Orten.

Antwort

8

Sie aus PredicateBuilder prüfen lassen

+1

Schön, macht genau das, was ich will :) –

10

Ein Prädikat ist nur eine Funktion, die einen booleschen Wert zurückgibt.

Ich kann es jetzt nicht testen, aber würde das nicht funktionieren?

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: basierend auf Matts Kommentare Wenn Sie die Delegierten zu komponieren wollen, können Sie auf diese Weise vorgehen

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

Ja, nur so was. Extrahieren Sie einfach den (x => something) Teil von wo und speichern Sie ihn in Expression >. – Euphoric

+0

Prost, aber ich möchte auf dem Filter/Prädikat aufbauen. Wenn also ein Schlüsselwort übergeben wird, fügen Sie den Filter dafür hinzu. Und wenn eine LocationId auch übergeben wurde, füge den Filter dafür hinzu ... Das ist es, wo mich alles verwirrt ... –

+0

Und wenn Sie den Ausdruck verwenden, wo Sie das Prädikat benötigen, verwenden Sie exp.Compile() – Les

Verwandte Themen