2013-02-07 11 views
0

我有我需要一個謂詞寫的表達式:如果涉及的成員在編譯時不知道,我該如何創建一個謂詞表達式樹?

.Where(e => SqlFunctions.StringConvert((double?) e.Number).Contains("6"))) 

然而,我想要的部件(在本例.Number)測試不是在編譯時已知的(這將是一個string參數) 。

我想:

.Where(string.Format(
     "SqlFunctions.StringConvert((double?){0}).Contains(@0)", field), value); 

但沒有奏效。在這種情況下如何創建謂詞?

+1

目前發生了什麼?你有第一行有什麼問題......你爲什麼要嘗試*任何*?第一行是什麼*問題*那麼「e.Number」的類型是什麼? –

+0

e.Number - int。我需要謂語,我沒有名字字段 – Mediator

+0

爲什麼不從句子中解釋你想要達到的目標?另外,在題外話中,我懶洋洋地問:「你爲什麼要嘗試任何東西?」。 –

回答

1

如果成員名稱(Number在這個例子中)在編譯時知道,你將不得不手動構建表達式樹,例如:

static Expression<Func<T, bool>> BuildPredicate<T>(
    string fieldName, string containsValue) 
{ 
    var arg = Expression.Parameter(typeof(T), "e"); 
    var str = Expression.Call(typeof(SqlFunctions), "StringConvert", null, 
     Expression.PropertyOrField(arg, fieldName)); 
    var contains = Expression.Call(str, "Contains", null, 
     Expression.Constant(containsValue, typeof(string))); 
    return Expression.Lambda<Func<T, bool>>(contains, arg); 
} 

與用法:

var predicate = BuildPredicate<Foo>("Number", "6"); 
var filtered = data.Where(predicate); 
+0

YOu優秀!!! – Mediator

相關問題