Well, the following code is self-explaining; I want to combine two expressions into one using And
operator. The last line causes rune-time the error:
Additional information: variable 'y' of type 'System.String' referenced from scope '', but it is not defined
Code:
Expression<Func<string, bool>> e1 = y => y.Length < 100;
Expression<Func<string, bool>> e2 = y => y.Length < 200;
var e3 = Expression.And(e1.Body, e2.Body);
var e4 = Expression.Lambda<Func<string, bool>>(e3, e1.Parameters.ToArray());
e4.Compile(); // <--- causes run-time error
The problem is that parameter expression objects that represents variable y
in expressions e1
and e2
are different. The fact that the two variables are named the same and have the same type does not matter: e1.Parameters.First()
and e2.Parameters.First()
is not the same object.
This causes the problem that you see: only e1
's parameter y
is available to Lambda<>
, while e2
's parameter y
is out of scope.
To fix this problem use Expression
APIs to create e1
and e2
. This way you would be able to share the parameter expression across them, thus eliminating the problem of scope.