4

我正在尝试编写一个表达式树,它可以允许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])使用表达式树?

4

0 回答 0