いくつかのビジネスルールに基づいてWhere句を生成する動的linqクエリに取り組んでいます。
入力文字列に二重引用符のない結果が含まれている場合は機能しますが、二重引用符が含まれているとエラーがスローされます。
string WhereClauseV1 = "Name.Contains(\"stack overflow\")"; --> Works for -> stack overflow
string WhereClasueV2 = "Name.Contains(\"stack\" overflow\")"; --> Throws error for -> stack" overflow
var result = context.Employee.Where(WhereClausev2).ToList();
私はusing System.Linq.Dynamic
また、 ここから既存のスタックオーバーフローソリューションを追跡しました 。しかし、私の場合、複数のAND / OR演算子を含む大きなWhere句と、等しい演算子のインスタンスがあります。where句でContainsを使用しているため、同様の演算子を使用します。
助けてくれてありがとう!!!
特別な記号を含む特定の文字列を句で使用したい場合は、私が思うに、このようにパラメータ化された形式を使用してください
Context.Users.Where("FirstName == @0", "\"Bob\"");
私の考えは、あなたが書いたように.Where()
を使用して動的linq評価を行うことはできないということです。その理由は、 Where()
がFirstName
が何であるかを理解せず、動的なLinq式を実行することを意図していないためです。次のような場所を使用します.Where( x => x.FirstName == "\"Bob\"");
そしてそれは確かに動作します。
次のように、ScottGuのブログにある既存のライブラリを使用することをお勧めします。
彼はあなたが説明しているすべてを行うコードをダウンロードしています。ライブラリのダイジェストには少し時間がかかりますが、プロジェクトで使用したことがあり、うまく機能します。あなたはラムダスについて少し知っている必要があり、あなたは遠くに行きます。
これがお役に立てば幸いです:)良い質問です。この解決策を見つけるのは難しいものでした。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~編集
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Dynamic.csを見てください。
2123行目、次のコードはメソッドParseToken()
存在します。
case '"':
case '\'':
char quote = ch;
do
{
NextChar();
while (textPos < textLen && ch != quote) NextChar();
if (textPos == textLen)
throw ParseError(textPos, Res.UnterminatedStringLiteral);
NextChar();
} while (ch == quote);
t = TokenId.StringLiteral;
break;
このパーサーが実行しているように見えることは、2番目の"
in [""Bob""]
読み取ると、文字列リテラルの終わりを検出したと見なして、ヌル文字列Literalを返し、識別子を解析します[Bob]
そして、別のnull文字列リテラルどういうわけか、トークンとして""
を探すようにパーサーを変更する必要があります。
おそらく、766行ParseComparison()
で、null文字列リテラルの後に識別子が続き、別のnull文字列リテラルを探す方法を考案できます。 ???
簡単な解決策は、パーサーを書き換えることがいくつかの大きな努力のように見えるので、 "
をnullに置き換えることです。