Comment analyser le filtre OData $ avec une expression régulière en C #?
Salut, je me demandais quelle est la meilleure approche serait d'analyser un OData $chaîne de filtre en C#, par exemple
/API/organisations?$filtre="nom eq 'Facebook' ou le nom de l'égaliseur Twitter et abonnés gt '30'"
Doit retourner toutes les organisations avec un nom de Facebook ou Twitter et qui ont plus de 30 abonnés. J'ai recherché un peu, mais ne peut pas trouver des solutions qui ne tourne pas autour de la WCF. Je pensais à l'aide de Regex et en les regroupant j'ai donc une liste
des classes de Filtre tels que:
Filter
Resource: Name
Operator: Eq
Value: Facebook
Filter
Resource: Name
Operator: Eq
Value: Twitter
Filter
Resource: Subscribers
Operator: gt
Value: 30
mais je suis perplexe, comme comment gérer Padn /ORs.
source d'informationauteur Nick Spicer
Vous devez vous connecter pour publier un commentaire.
Vérifier cette regex avec les drapeaux je et x.
Démo
http://regexhero.net/tester/?id=0a26931f-aaa3-4fa0-9fc9-1a67d34c16b3
Exemple de code
De sortie
Discussion
Afin d'avoir des majuscules pour des ressources et de l'opérateur, l'utilisation d'un MatchEvaluator.
Le regroupement avec
(
et)
ne sont pas pris en charge. Laisser un commentaire si vous voulez que la regex pour le soutenir..NET, il y a une librairie qui va le faire pour vous. La rédaction de votre propre regex risque de rater certains cas limites.
À l'aide de NuGet, apporter de Microsoft.Les données.OData. Ensuite, vous pouvez faire:
result
ici sera sous la forme d'un AST représentant la clause de filtre.(Pour obtenir le
model
ettype
entrées, vous pouvez analyser votre $fichier de métadonnées en utilisant quelque chose comme ceci:)
Appuyant sur ce que Jen S dit, vous pouvez parcourir les AST de l'arbre qui est retourné par la FilterClause.
Par exemple, vous pouvez récupérer le FilterClause à partir du contrôleur d'options de requête:
Vous pouvez alors parcourir la résultante de l'AST de l'arbre avec le code suivant (emprunté à cet article):
La fonction appelée est comme suit:
Ensuite, vous pouvez aller dans le dictionnaire de la liste et récupérer vos valeurs:
Cet exemple est assez simpliste qu'il ne représente que "eq" les évaluations, mais pour ma part ça a bien fonctionné. YMMV. 😉
Je pense que vous êtes censé travserse l'AST avec l'interface fournie à l'aide du modèle visiteur.
Considérez que vous avez cette classe qui représente un filtre
Alors, comment pouvons-nous "extrait de" les filtres qui vient avec le OData paramètres de votre classe?
Bien le FilterClause objet ont une Expression qui est un SingleValueNode qui hérite d'une QueryNode. Le QueryNode ont l'Accepter méthode qui prend un QueryNodeVisitor.
Droit, de sorte que vous devez mettre en place votre propre QueryNodeVisitor et faire de votre stuff. Ci-dessous est un non fini (je n'ai pas de remplacer tous les visiteurs potentiels).
Puis, le feu de suite 🙂
Quand il a parcouru l'arborescence de votre
doit contenir les filtres dans le format désiré. Je suis sûr que plus de travail est nécessaire, mais si vous pouvez l'obtenir de roulement, je pense que vous pouvez comprendre.