2013-11-05 101 views
0

我使用斯科特谷的動態LINQ和下面這個例子:動態Linq where子句與對象?

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]**"); 

我會在運行時用對象的值屬性填寫

誰能告訴我如何做到這一點?

感謝

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

我可以用類似Expression<Func<Customer, bool>> e1 = DynamicExpression.ParseLambda<Customer, bool>("Age > @Persion1.Age",objPerson1);這一翻譯的@ 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); 
+0

感謝@ pil0t,這是正是我所期望的。 但是,目前,我讓用戶輸入動態where子句,如:[Person.Age> Person1.Age]。那麼,我可以將部分[Age = @ 0.MyProp] ==> @ 0替換爲[@Person1.MyProp]之類的其他內容嗎? – user2954868

+0

在字符串表達式中,您只能使用@ 0 @ 1 @ 2等作爲參數佔位符,因爲表達式編譯器無法訪問您的方法範圍。 – pil0t