3

from this link i can dynamically create an Expression < Func< T, bool>> predicate

this code can dynamically create s=>s.Id == 1

ParameterExpression argParam = Expression.Parameter(typeof(User), "s");
var propertyExp = Expression.Property(parameterExp, "Id");
var constExp = Expression.Constant(1);

var body = Expression.Equal(propertyExp, constExp);
var lambda = Expression.Lambda<Func<User, bool>>(body, parameterExp);

but how do i create Expression < Func< T1,T2,bool>> and Expression < Func < T1,T2,T3,bool>>

how dynamically create like this: (a,b)=> a.Id== 1 && b.Name == "name"

try
  • 55
  • 5
  • 1
    What this expression should do? Please [edit](https://stackoverflow.com/posts/55084573/edit) your question and add an example (with static lambdas or pseudocode) – Aleks Andreev Mar 10 '19 at 09:02
  • dynamically create like this: (a,b)=> a.Id== 1 && b.Name == "name" – try Mar 10 '19 at 13:50

1 Answers1

3

The difference between Func<T, bool> and Func<T1, T2, bool> is that second accept two arguments, so you need to create two parameters with Expression.Parameter.

Code below will create an expression

(t1, t2) => t1.Id == 1 && t2.Name == name;

private static Expression<Func<T1, T2, bool>> CreateExpression<T1, T2>()
{
    var t1 = Expression.Parameter(typeof(T1), "t1");
    var t2 = Expression.Parameter(typeof(T2), "t2");

    var idProp = Expression.PropertyOrField(t1, "Id");
    var nameProp = Expression.PropertyOrField(t2, "Name");

    var body = Expression.AndAlso(
        Expression.Equal(idProp, Expression.Constant(1)),
        Expression.Equal(nameProp, Expression.Constant("name"))
    );

    var lambda = Expression.Lambda<Func<T1, T2, bool>>(body, t1, t2);
    return lambda;
}
Aleks Andreev
  • 7,016
  • 8
  • 29
  • 37