我有一个我需要为谓词写的表达式:
.Where(e => SqlFunctions.StringConvert((double?) e.Number).Contains("6")))
但是,我想要测试的成员(示例中为.Number
)在编译时是未知的(它将是string
参数。)
我试过了:
.Where(string.Format(
"SqlFunctions.StringConvert((double?){0}).Contains(@0)", field), value);
但那没用。在这种情况下如何创建谓词?
答案 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);