动态Linq where子句与对象?

时间:2013-11-05 03:43:01

标签: c# linq dynamic lambda where

我正在使用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之类的东西。 ?

1 个答案:

答案 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);