如果在编译时不知道所涉及的成员,如何创建谓词表达式树?

时间:2013-02-07 09:16:34

标签: c# entity-framework entity-framework-5

我有一个我需要为谓词写的表达式:

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

但是,我想要测试的成员(示例中为.Number)在编译时是未知的(它将是string参数。)

我试过了:

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

但那没用。在这种情况下如何创建谓词?

1 个答案:

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