我正在尝试编写一个表达式树,它可以允许StartsWith()
使用实体框架在非字符串值列上动态使用方法。
例如IntegerValuedColumn.StartsWith(5)
会返回500
, 5000
, 555
, 5123
, 等
我正在尝试根据此答案编写表达式树:
这是我到目前为止所拥有的:
MethodInfo stringConvert = typeof(SqlFunctions).GetMethod("StringConvert", new[] { typeof(double?) });
Expression castExpression = Expression.Convert(propertyExpression, typeof(double?));
Expression convertExpression = Expression.Call(null, stringConvert, castExpression);
MethodInfo trimStart = typeof(string).GetMethod("TrimStart");
Expression nullExpression = Expression.Constant(null, typeof(char[]));
Expression trimExpression = Expression.Call(convertExpression, trimStart, nullExpression);
MethodInfo startsWith = typeof(string).GetMethod("StartsWith", new[] { typeof(string) });
Expression methodExpression = Expression.Call(trimExpression, startsWith, constantExpression);
return methodExpression;
当我编译并运行这个表达式时,我得到以下异常:
仅当没有将修剪字符指定为参数时,LINQ to Entities 才支持方法“System.String TrimStart(Char[])”。
在原始示例中,表达式为:
SqlFunctions.StringConvert((double)x.AccountNumber)
.TrimStart().StartsWith(searchTerm)
但我得到的结果是:
StringConvert(Convert(x.AccountNumber)).TrimStart(null).StartsWith(searchTerm)
我删除了处理 TrimStart 的两行(nullExpression 和 trimExpression),并验证了语句是否运行(不包括错误是由不同的语言使用引起的)。我基于异常消息的理论是 TrimStart() 方法希望使用零参数调用,但是当我尝试表达式构建器告诉我传入的参数数量不正确时,我想我只是错过了某物。
我将如何去调用 TrimStart 方法TrimStart()
而不是TrimStart(null)
或TrimStart(new char[0])
使用表达式树?