0

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

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

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

我试过了:

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

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

4

1 回答 1

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);
于 2013-02-07T10:49:02.040 回答