2014-04-07 38 views
0

我需要下面的C#代碼被翻譯成一個有效的實體框架6的表達:如何動態創建以下LINQ表達式?

(f => f.GetType().GetProperty(stringParamter).GetValue(f).ToString() == anotherStringParameter) 

This guy這樣做是爲了「排序」的一部分,但我似乎無法推測出來的「其中」部分...

一般地講什麼,我想在這裏實現的是動態查詢,其中用戶將「撿」性質的「保管箱」來篩選的一種形式,提供過濾值和命中查詢...通常人們不喜歡f => f.TargetProp == userValue但我不能這樣做,當我不知道哪一個是...

回答

5

您需要構造一個表示訪問屬性的表達式樹:

public static Expression<Func<T, bool>> PropertyEquals<T>(
    string propertyName, string valueToCompare) 
{ 
    var param = Expression.Parameter(typeof(T)); 
    var body = Expression.Equal(Expression.Property(param, propertyName) 
     , Expression.Constant(valueToCompare)); 
    return Expression.Lambda<Func<T, bool>>(body, param); 
} 

這允許你寫:

query = query.Where(PropertyEquals<EntityType>(stringParameter, anotherString)); 
+0

如果我想比較固定/預先確定的子屬性?這樣的:不是'Expression.Property(PARAM,propertyName的)'像'Expression.Property(PARAM,propertyName.Title)' – Leonardo

+0

@Leonardo然後用兩個'Expression.Property'電話訪問的結果的固定屬性以前的財產訪問。 – Servy

1

你有沒有考慮過使用動態鏈接庫?它允許您將表達式組合爲字符串而不是lambda表達式。

例子:

var query = baseQuery.Where("Id=5"); 

var query = baseQuery.Where("[email protected]", 5); 

我的情況下,一直保持微軟的Dynamic Linq的例子的更新版本在https://github.com/NArnott/System.Linq.Dynamic你有興趣,並且它也提供的NuGet。

+0

我不知道!我會檢查出來的! – Leonardo