我正在使用Scott Gu的Dynamic Linq并遵循这个例子:
Expression<Func<Customer, bool>> e1 = DynamicExpression.ParseLambda<Customer, bool>("City = \"London\"");
Expression<Func<Customer, bool>> e2 = DynamicExpression.ParseLambda<Customer, bool>("Orders.Count >= 10");
IQueryable<Customer> query = db.Customers.Where("@0(it) and @1(it)", e1, e2);
但在我的情况下,我希望在e1中使用object.property的动态变量,e2 ...在where子句中这样:
Expression<Func<Customer, bool>> e1 = DynamicExpression.ParseLambda<Customer, bool>("City = **[object.property]**");
我将在运行时填充对象的value属性
有人可以告诉我怎么做吗?
由于
P / s:这可以在表达式的情况下完成:
var exp = "Person.Age = Persion1.Age";
var p = Expression.Parameter(typeof(Person), "Person");
var p1 = Expression.Parameter(typeof(Person1), "Person1");
var e = DynamicExpression.ParseLambda(new[] { p,p1 }, null, exp);
var result = e.Compile().DynamicInvoke(p,p1);
但我不知道如何在where子句中执行此操作。
编辑,如@ pil0t:
这种情况的答案是使用:Expression<Func<Customer, bool>> e1 = DynamicExpression.ParseLambda<Customer, bool>("Age > @0.Age",objPerson1);
我可以使用{0}的Expression<Func<Customer, bool>> e1 = DynamicExpression.ParseLambda<Customer, bool>("Age > @Persion1.Age",objPerson1);
intead之类的东西。 ?
答案 0 :(得分:0)
如果您的目标是按名称获取属性值,则只需使用反射:
object obj = new {MyProp = 123};
var valueOfDynamicProperty = obj.GetType().GetProperty("MyProp").GetValue(obj);
Expression<Func<Customer, bool>> e1 = DynamicExpression.ParseLambda<Customer, bool>("Age = @0", valueOfDynamicProperty);
对于动态表达式中的使用属性名称,必须以在ParseLambda中传递的类型声明,因此:
object obj = new {MyProp = 123};
Expression<Func<Customer, bool>> e1 = DynamicExpression.ParseLambda<Customer, bool>("Age = @0.MyProp", obj);
不起作用,但您可以传递特定类型:
public class MyClass
{
public int MyProperty {get;set;}
}
...
var obj = new MyClass {MyProperty = 123}; // obj is MyClass
Expression<Func<Customer, bool>> e1 = DynamicExpression.ParseLambda<Customer, bool>("Age = @0.MyProp", obj);