2010-10-14 9 views
8

Quedarse un poco atascado en esto. Básicamente, tengo un método que quiero devolver una expresión de predicado que pueda usar como una condición Where. Creo que lo que tengo que hacer es similar a esto: http://msdn.microsoft.com/en-us/library/bb882637.aspx pero estoy un poco atascado en cuanto a lo que tengo que hacer.Cómo construir dinámicamente y devolver un predicado linq basado en la entrada del usuario

Método:

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

} 

Ejemplo de Uso:

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

necesito esta separación para que pueda pasar a mi predicado en mi repositorio y utilizarlo en otros lugares.

Respuesta

8

¿Ha revisado PredicateBuilder

+1

Agradable, hace exactamente lo que quiero :) –

10

Un predicado es solo una función que devuelve un valor booleano.

No puedo probarlo, en este momento, pero ¿no funcionaría?

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: basado en los comentarios de Matt Si desea componer los delegados, se podía proceder de esta manera

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

Sí, sólo Me gusta esto. Simplemente extraiga la parte (x => something) de donde y guárdela en Expression >. – Euphoric

+0

Saludos, pero quiero construir sobre el filtro/predicado. Entonces, si se pasa una palabra clave, agregue el filtro para eso. Y si un lugar también pasó, agrega el filtro para eso ... Ahí es donde todo me confunde ... –

+0

Y cuando usas la expresión donde necesitas el predicado, usa exp.Compile() – Les

Cuestiones relacionadas