StartsWith()
Entity Framework を使用して、文字列以外の値の列でメソッドを動的に使用できる式ツリーを作成しようとしています。
たとえば、、、、、などをIntegerValuedColumn.StartsWith(5)
返します500
5000
555
5123
この回答に基づいて式ツリーを作成しようとしています:
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;
この式をコンパイルして実行すると、次の例外が発生します。
メソッド 'System.String TrimStart(Char[])' は、引数としてトリム文字が指定されていない場合にのみ、LINQ to Entities でサポートされます。
元の例では、式は次のとおりです。
SqlFunctions.StringConvert((double)x.AccountNumber)
.TrimStart().StartsWith(searchTerm)
しかし、私が得るものは次のようになります:
StringConvert(Convert(x.AccountNumber)).TrimStart(null).StartsWith(searchTerm)
TrimStart を扱う 2 行 (nullExpression と trimExpression) を削除し、ステートメントが実行されることを確認しました (別の言語の使用が原因でエラーが発生しているという考えは除きます)。例外メッセージに基づく私の理論は、TrimStart() メソッドがゼロのパラメーターで呼び出されることを望んでいるということですが、それを試みると、間違った数のパラメーターが渡されたことが Expression Builder から通知されるため、欠落していると判断します。なにか。
TrimStart()
式ツリーの代わりに、TrimStart(null)
またはTrimStart(new char[0])
式ツリーを使用して、TrimStart メソッドを呼び出すにはどうすればよいですか?