Лямбда-выражение "rules" является частью компилятора c # (или любого языка, который вы используете);Само выражение не имеет автоматического знания контекста.Вместо этого, если вы «захватываете» переменную, то есть x
ниже:
int x = ...
Expression<Func<Foo, bool>> predicate = obj => obj.Bar == x;
, компилятор создает экземпляр сгенерированного класса контекста и использует ConstantExpression
для его связывания с деревом:
// approximate representative code; not literal translation
var ctx = new SomeContext();
ctx.x = ... // x is actually a public instance field of SomeContext
var param = Expression.Parameter(typeof(Foo), "obj");
var predicate = Expression.Lambda<Func<Foo, bool>>(
Expression.Equal(
Expression.PropertyOrField(param, "Bar"),
Expression.PropertyOrField(Expression.Constant(ctx), "x")
), param);
Единственный способ «заменить» экземпляр контекста - переписать все выражение, как правило, через ExpressionVisitor
.Также обратите внимание, что вложенные области действия могут привести к более сложным сценариям, включающим связанные объекты контекста.
Лично;Я сомневаюсь, что вам нужно беспокоиться об этом.