我正在尝试编写一个表达式树,它允许使用Entity Framework在非字符串值列上动态使用StartsWith()
方法。
E.g。 IntegerValuedColumn.StartsWith(5)
将返回500
,5000
,555
,5123
等
我正在尝试根据这个答案写一个表达式树:
How do I query an integer column for "starts with" in Entity Framework?
这是我到目前为止所做的:
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(null)
或TrimStart(new char[0])
之类的TrimStart方法?