Я могу динамически создавать выражение> предикат, но как мне создать выражение> - PullRequest
1 голос
/ 10 марта 2019

из эта ссылка я могу динамически создавать выражение > предикат

, этот код может динамически создавать 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);

но как мне создать выражение > и выражение >

как динамически создавать, как это: (a, b) => a.Id == 1 && b.Name == "name"

1 Ответ

3 голосов
/ 10 марта 2019

Разница между Func<T, bool> и Func<T1, T2, bool> заключается в том, что секунда принимает два аргумента, поэтому вам нужно создать два параметра с Expression.Parameter.

Приведенный ниже код создаст выражение

(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;
}
...