如果成员名称(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);