次のクエリがあります。
query.Where("@0 != null && @1.ToString().Contains(@2)",
searchedColumnName, searchedColumnName, searchedValue);
また、機能しません(取得する必要のあるレコードが複数あります)。
たとえば、 searchedColumnName == "MY_COLUMN"
、およびsearchedValue == "8"
ます。 Dynamic Linqメソッドにデバッグすると、結果のLambdaExpression
式は次のようになりLambdaExpression
。
{Param_0 => ((Convert("MY_COLUMN") != null) AndAlso "MY_COLUMN".ToString().Contains("8"))}
今、私がプレースホルダーを使用しない場合、次のようになります:
query.Where(searchedColumnName + " != null && " +
searchedColumnName + ".ToString().Contains(\"" + searchedValue +"\")");
LambdaExpression
は次のLambdaExpression
です。
{Param_0 => ((Param_0.MY_COLUMN != null) AndAlso Param_0.MY_COLUMN.ToString().Contains("8"))}
そしてそれは動作します。
私はプレースホルダーを間違って使用していることを意味すると思いますか?
はい、プレースホルダーの記述方法に問題があります。
列名「MY_COLUMN」は、列ではなく文字列と見なされます 。
したがって、ここでは列名のプレースホルダーを使用できないと思います。以下のコードを使用できます。
.Where(searchedColumnName + "= @ 0"、searchedValue);
C#6の場合.Where($ "{searchedColumnName} = @ 0"、searchedValue);
このリンクを参照してください。それは動的INQフィルターを非常によく説明します: