¿Cómo creo dinámicamente una expresión > ¿predicado?

c# expression-trees lambda linq

Pregunta

¿Cómo podría utilizar un árbol de expresiones para crear dinámicamente un predicado que se parece a algo como ...

(p.Length== 5) && (p.SomeOtherProperty == "hello") 

Para que pueda pegar el predicado en una expresión lambda así ...

q.Where(myDynamicExpression)...

Solo necesito que me apunten en la dirección correcta.

Actualización: Lo siento, gente, omití el hecho de que quiero que el predicado tenga varias condiciones como las anteriores. Perdón por la confusion.

Respuesta aceptada

Original

Al igual que:

    var param = Expression.Parameter(typeof(string), "p");
    var len = Expression.PropertyOrField(param, "Length");
    var body = Expression.Equal(
        len, Expression.Constant(5));

    var lambda = Expression.Lambda<Func<string, bool>>(
        body, param);

Actualizado

re (p.Length== 5) && (p.SomeOtherProperty == "hello") :

var param = Expression.Parameter(typeof(SomeType), "p");
var body = Expression.AndAlso(
       Expression.Equal(
            Expression.PropertyOrField(param, "Length"),
            Expression.Constant(5)
       ),
       Expression.Equal(
            Expression.PropertyOrField(param, "SomeOtherProperty"),
            Expression.Constant("hello")
       ));
var lambda = Expression.Lambda<Func<SomeType, bool>>(body, param);

Respuesta popular

Utilice el generador de predicados.

http://www.albahari.com/nutshell/predicatebuilder.aspx

¡Es bastante fácil!



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow