Ich versuche, ein dynamisches Filtersystem mithilfe der DynamicLINQ- Bibliothek zu erstellen . Ich habe alles reibungslos funktioniert, wenn Sie etwas tun wie: Leute mit Vornamen finden ist Bob:
Context.Users.Where("FirstName == \"Bob\"");
Aber ich habe Probleme, wenn ich etwas tun möchte: Personen mit Vornamen zu finden ist "Bob" (wobei Bob in doppelten Anführungszeichen in der Datenquelle gespeichert ist).
Ich habe ein paar verschiedene Dinge ausprobiert, darunter das Entkommen eines entkommenen doppelten Anführungszeichens und einige andere Varianten:
Context.Users.Where("FirstName == \"\\\"Bob\\\"\"");
// or as a literal for readability
Context.Users.Where(@"FirstName == ""\""Bob\""""");
// From comments below
Context.Users.Where("FirstName == \"\"Bob\"\"");
Keine dieser Arbeiten. Jede Hilfe wäre sehr dankbar.
Vielen Dank.
BEARBEITEN - Ich beschäftige mich gerade mit der resultierenden Zeichenfolge. Die eigentliche Zeichenfolge wird aus einem Modell generiert.
Wenn Sie in Klausel eine bestimmte Zeichenfolge mit speziellen Symbolen verwenden möchten, verwenden Sie, wie ich denke, besser eine parametrisierte Form wie diese
Context.Users.Where("FirstName == @0", "\"Bob\"");
Meiner Meinung nach können Sie .Where()
nicht verwenden, um dynamische Linq-Auswertungen durchzuführen, wie Sie sie geschrieben haben. Der Grund dafür ist, dass Where()
nicht versteht, was FirstName
ist, und niemals dynamische Linq-Ausdrücke FirstName
sollte. Sie würden wo wie folgt verwenden .Where( x => x.FirstName == "\"Bob\"");
und das wird sicher funktionieren.
Ein guter Vorsprung besteht darin, eine vorhandene Bibliothek im ScottGu-Blog wie folgt zu verwenden:
Er hat einen Download mit Code, der alles macht, was Sie beschreiben. Das Verdauen der Bibliothek wird einige Zeit dauern, aber ich habe sie in einem Projekt verwendet und sie funktioniert hervorragend. Sie müssen ein wenig über Lambdas wissen und Sie werden weit gehen.
Hoffe das hilft :) Gute Frage, ich war dort und habe das getan. Es war schwierig, diese Lösung zu finden.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ EDIT
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Schauen Sie sich Dynamic.cs an:
Zeile 2123 Der folgende Code ist in der Methode 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;
Dieser Parser scheint Folgendes zu tun: Wenn er das zweite "
in [""Bob""]
liest, gibt er ein Null-String-Literal zurück, da er glaubt, das Ende des String-Literal gefunden zu haben, würde er einen Bezeichner [Bob]
analysieren. und dann noch ein Null-String-Literal. Irgendwie müssen Sie den Parser ändern, um nach ""
als Token zu suchen.
Vielleicht können Sie in ParseComparison()
in Zeile 766 eine Möglichkeit finden, nach Null-String-Literal zu suchen, gefolgt von einem Bezeichner, gefolgt von einem anderen Null-String-Literal. ???
Eine einfache Lösung besteht darin, "
durch null zu ersetzen "
da das Umschreiben des Parsers ein großer Aufwand ist.