2016-06-07 52 views
0

我在LINQ動態下一個代碼:找得到的LINQ表達式,其中

var list = server1Products.Where("Field1 = @0 AND Field2 >= @2", arg1, arg2).ToList(); 

我需要得到導致LINQ表達使用LINQ動態後,WHERE,所以在另一個使用列表

如何獲得由此產生的LINQ表達式?

.Where("Field1 = @0 AND Field2 >= @2", arg1, arg2) 

例子:

// get the LINQ expression from WHERE 
var conditions = GetExpresionFromWhere(list); // HOW TO DO? 
// 
// apply the same filter expression on another list 
var result2 = list2.Where(conditions); 

非常感謝!

+1

'list'變量只是一個'清單'比如像任何其他的,沒有什麼,你可以從它那裏得到。 –

+0

完美@IvanStoev!...請記住,這是一個解釋需求的例子。我需要從WHERE獲取LINQ表達式。該變量僅用於說明。 – JaimeCamargo

回答

2

從本質上講,DynamicLinq在這裏爲你做的是解析你所傳遞的string(連同參數)到Expression<Func<T, bool>>中。

所以,爲了有存儲在一個變量所需的Expression<Func<T, bool>>,你可以這樣做:

var conditions = DynamicExpression.ParseLambda<ENTITY, bool>("Field1 = @0 AND Field2 >= @1", arg1, arg2); 

(其中ENTITY是你的實體類型)

然後使用它:

var result2 = list2.Where(conditions); 

此外,如果list2不再是IQueryable<ENTITY>而是IEnumerable<ENTITY>,您必須編寫勒ExpressionFunc<ENTITY, bool>如下:

var result2 = list2.Where(conditions.Compile()); 

Source

1

雖然這是不可能的,你可以解決這是它已經被執行後列表中使用的表達,你可以考慮存儲的表達和使用它在多個位置:

Expression<Func<ServerProductClass, bool>> conditions = BuildWhereExpression(); 

如果您BuildWhereExpression()方法看起來像下面這樣,並會產生必要的表達式:

public Expression<Func<ServerProductClass, bool>> BuildExpression(string predicate, object[] terms) 
{ 
    return DynamicExpression.ParseLambda<ServerProductClass, bool>(predicate, terms); 
} 

所以整個代碼可能是這個樣子:

// Build your condition 
var condition = BuildExpression("Field1 = @0 AND Field2 >= @2", new object[]{arg1, arg2 }); 

// Filter your initial list 
list = list.Where(condition).ToList(); 

// Use it again later 
var list2 = someOtherList.Where(condition).ToList(); 
0
// get the LINQ expression from WHERE 
// Entity => your type of items in server1Products 
Expression<Func<Entity, int>> conditions = x => x.Field1 == arg1 && x.Field2 = arg2; 


// apply the same filter expression on another list 
var result2 = list2.Where(conditions);