4

StartsWith()Entity Framework を使用して、文字列以外の値の列でメソッドを動的に使用できる式ツリーを作成しようとしています。

たとえば、、、、、などをIntegerValuedColumn.StartsWith(5)返します50050005555123

この回答に基づいて式ツリーを作成しようとしています:

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 メソッドを呼び出すにはどうすればよいですか?

4

0 に答える 0