Создайте унарное GreaterThan Linq.Expression, объединив два выражения

У меня есть два выражения (может быть константой или выражением свойства) leftExpr и rightExpr, и я хотел бы создать комбинированное выражение, которое больше, чем между результатами, например так:

Expression.Lambda<Func<object, bool>>(x => Expression.GreaterThan(leftExpr(x),rightExpr(x))

Это явно не работает, как правильно пойти? (Я новичок в деревьях выражений)

Код левого и правого выражений:

Expression leftExpr, rightExpr;
if (left_element.All(char.IsDigit)) 
{
    leftExpr = Expression.Constant(int.Parse(left_element));
}
else
{
    leftExpr = Expression.PropertyOrField(Expression.Parameter(t), left_element);
}

if (right_element.All(char.IsDigit)) 
{
    rightExpr = Expression.Constant(int.Parse(right_element));
}
else
{
    rightExpr = Expression.PropertyOrField(Expression.Parameter(t), right_element);
}

person Szolnoki Ádám    schedule 12.08.2015    source источник
comment
Почему бы просто не сделать var result = Expression.GreaterThan(leftExpr, rightExpr)?   -  person Hjalmar Z    schedule 12.08.2015
comment
Почему вы используете этот странный синтаксис if(condition);else{...}? Почему бы просто не отменить условие: if(!condition){...} ?   -  person Koopakiller    schedule 12.08.2015
comment
@Koopakiller Он делает что-то в if. Очень странное форматирование, использовать {} для else, но не для if.   -  person Hjalmar Z    schedule 12.08.2015
comment
Создайте вспомогательные методы leftExpr() и rightExpr() и поместите два оператора if в каждый из этих двух новых методов.   -  person jdweng    schedule 12.08.2015
comment
как я могу отфильтровать IEnumerable‹t›, используя выражение var result = Expression.GreatherThan(leftExpr, rightExpr)?   -  person Szolnoki Ádám    schedule 12.08.2015
comment
@HjalmarZ О, я этого не видел, но форматирование не очень читаемо   -  person Koopakiller    schedule 12.08.2015
comment
вы используете Expression.Lambda неправильно, должно быть так: Expression.Lambda<Func<object, bool>>(Expression.GreaterThan(leftExpr,rightExpr), x) где x равно ParamenterExpression   -  person Grundy    schedule 12.08.2015


Ответы (1)


Вы используете его немного неправильно: во-первых, вы должны использовать одно ParameterExpression и исправить Expression.Lambda. Если исправить это, это будет выглядеть так

Expression leftExpr, rightExpr;
var x = Expression.Parameter(t);
if (left_element.All(char.IsDigit)) 
{
    leftExpr = Expression.Constant(int.Parse(left_element));
}
else
{
    leftExpr = Expression.PropertyOrField(x, left_element);
}

if (right_element.All(char.IsDigit)) 
{
    rightExpr = Expression.Constant(int.Parse(right_element));
}
else
{
    rightExpr = Expression.PropertyOrField(x, right_element);
}

и

Expression.Lambda<Func<object, bool>>(Expression.GreaterThan(leftExpr,rightExpr),x);
person Grundy    schedule 12.08.2015