Wie zu analysieren OData $filter mit regulären Ausdrücken in C#?
Hallo ich Frage mich, was der beste Ansatz wäre, zu analysieren OData $filter-string in C#, zum Beispiel
/API/Organisationen?$filter="name-eq 'Facebook' oder name-eq 'Twitter' und Abonnenten gt '30'"
Zurückkehren sollten alle Organisationen, die einen Namen von Facebook oder Twitter und die mehr als 30 Teilnehmer. Ich habe recherchiert, einiges aber nicht finden können, von Lösungen, die sich nicht umkreisen, WCF. Ich dachte, der Verwendung von Regex und gruppieren Sie Sie, damit ich eine Liste
der Filter-Klassen so, dass:
Filter
Resource: Name
Operator: Eq
Value: Facebook
Filter
Resource: Name
Operator: Eq
Value: Twitter
Filter
Resource: Subscribers
Operator: gt
Value: 30
aber ich bin ratlos, wie Sie zu behandeln ANDs /ORs.
Erwägen Sie die Verwendung einer eigentlichen parser toolkit und arbeiten aus der Skillung, nicht zu stolpern, um mit einem Bündel von REs. Die Doku fand ich die Erwähnung eines "normativen OData-Spezifikation" mit einer Grammatik für den filter Ausdruck.
InformationsquelleAutor Nick Spicer | 2014-01-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Überprüfen Sie diese regex mit den Fahnen ich und x.
Demo
http://regexhero.net/tester/?id=0a26931f-aaa3-4fa0-9fc9-1a67d34c16b3
Beispielcode
- Ausgang
Diskussion
Damit haben Sie Großbuchstaben für Ressourcen-und-operator wird ein MatchEvaluator.
Die Gruppierung mit
(
und)
werden allerdings nicht unterstützt wird. Lassen Sie Kommentar, wenn Sie möchten, dass die regex-zu unterstützen.Du bist willkommen 😉
Könntest du noch die Gruppierung mit ( und ) ? Dank
Ich Verstand nicht die Frage. Sollten Sie eine weitere Frage stellen, für die Dinge zu erklären...
Sorry ich war nicht klar. Am Ende Ihrer Antwort sagen Sie, dass die Verwendung von Klammern ist nicht unterstützt durch die regex oben, aber einen Kommentar hinterlassen, wenn Sie wollen, dass es zur Unterstützung der parens. Ich Frage mich, wenn Sie hatte noch die änderung oder habe ich das falsch verstanden?
InformationsquelleAutor Stephan
In .NET, dort gibt es eine Bibliothek zur Verfügung, die dies für Sie tun. Schreiben Sie Ihre eigene regex Gefahr läuft, fehlen einige edge-Fall.
NuGet, bringen Microsoft.Daten.OData. Dann können Sie tun:
result
hier wird in form eines AST repräsentiert die filter-Klausel.(Um die
model
undtype
Eingänge, könnten Sie analysieren Ihre $Metadaten-Datei mit etwas wie:)
IEdmModel
hat eine Tonne der Mitglieder umzusetzen und ich bin der Hoffnung, um zu vermeiden, dass zu lernen, was jeder einzelne tut.Gibt es eine Möglichkeit, nur die download-Quelle von C++ ohne Verwendung von nuGet? Gibt es ein source-repository für die Microsoft.Daten.OData überall?
Nur ein Hinweis: Diese Lösung verwendet Odata-V 3.0. (
Microsoft.Data.OData
). Die neueren OData-V 4.0 erfordertMicrosoft.OData.Core
InformationsquelleAutor Jen S
Gebäude auf, was Jen S sagt, kannst du die traverse AST Baum, der zurückgegeben wird, durch die FilterClause.
Zum Beispiel können Sie abrufen, die FilterClause von der Steuerung s-Abfrage-Optionen:
Können Sie dann durchqueren die daraus resultierenden AST Baum mit code wie dem folgenden (ausgeliehen von dieser Artikel):
Die Funktion, die aufgerufen wird, etwa so:
Können Sie dann gehen Sie durch die Liste, Wörterbuch und abrufen Ihrer Werte:
Diesem Beispiel ist Recht simpel, es werden nur Konten für die "eq" - Bewertungen, aber für meine Zwecke war es gut. YMMV. 😉
InformationsquelleAutor Stinky Buffalo
Ich denke, Sie sollen travserse den AST mit der Schnittstelle, die mit dem Besucher-Muster.
Denken, dass Sie diese Klasse repräsentiert einen filter
So, wie wir "extrahieren" - Filter, die mit dem OData-Parameter, um Ihre Klasse?
Sowie die FilterClause Objekt ein Expression-Eigenschaft, die eine SingleValueNode wich erbt von einer QueryNode. Der QueryNode haben, die Accept-Methode der QueryNodeVisitor.
Rechts, so müssen Sie implementieren Ihre eigenen QueryNodeVisitor und tun Sie Ihre Sachen. Unten ist eine nicht fertige Beispiel (I dont überschreiben alle möglichen Besucher).
Dann, Feuer frei 🙂
Wenn es durchquert hat den Baum Ihre
enthalten sollte der Filter in Ihrem gewünschten format. Ich bin sicher, dass mehr Arbeit erforderlich ist, aber wenn Sie können diese Rollen denke ich, kann man es herausfinden.
Nur ein Hinweis: Wenn Sie mithilfe von Odata-V4.0, wie ich es Tue, müssen Sie
Microsoft.OData.Core.UriParser.TreeNodeKinds.BinaryOperatorKind.And
stattVielen Dank für die real-life-Beispiel! Aber warum
return current as TSource
? Ist dies retunr von jedem überall nutzen? Ich versuchte wieder null in mein überschrieben Besuchen (...) - Methoden, und es funktionierte auch. Gibt es eine ausführliche Hilfe zum überschreiben von diesen besuchen? Ich habe es nicht geschafft, Google es aus, diese Antwort scheint zu sein, die nur googlable-source-ImplementierungQueryNodeVisitor
Ich weiß es eigentlich nicht. Aber die Unterschrift sagt return T und so machte ich es, dass.
Sie können wählen Sie den Typ T zu werden, so etwas wie List<FilterValue> wenn Sie wollen, und dann müssen Sie nicht haben, um Zugang zu den inneren filterValueList direkt.
InformationsquelleAutor PvPlatten