【问题标题】:Dynamic Linq where clause with object?带有对象的动态Linq where子句?
【发布时间】:2013-11-05 03:43:00
【问题描述】:

我正在使用 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、e2... 的 where 子句中拥有 object.property 的动态变量,如下所示:

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&lt;Func&lt;Customer, bool&gt;&gt; e1 = DynamicExpression.ParseLambda&lt;Customer, bool&gt;("Age &gt; @0.Age",objPerson1);

我可以使用Expression&lt;Func&lt;Customer, bool&gt;&gt; e1 = DynamicExpression.ParseLambda&lt;Customer, bool&gt;("Age &gt; @Persion1.Age",objPerson1); 之类的东西而不是@0。 ?

【问题讨论】:

    标签: c# linq dynamic lambda where


    【解决方案1】:

    如果您的目标是按名称获取属性值,则可以简单地使用反射:

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

    【讨论】:

    • 谢谢@pil0t,这正是我所期望的。但是,目前,我让用户输入动态 where 子句,例如: [Person.Age > Person1.Age] 。那么,我可以将部分 [Age = @0.MyProp] ==> @0 替换为 [@Person1.MyProp] 之类的其他内容吗?
    • 在字符串表达式中,您只能使用@0 @1 @2 等作为参数占位符,因为表达式编译器无法访问您方法的范围。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 2010-10-25
    • 1970-01-01
    • 2013-07-21
    • 1970-01-01
    相关资源
    最近更新 更多