Comment créer une expression "contient ou LIKE" dynamique à utiliser avec le service Linq contre OData

c# expression-trees linq odata

Question

J'essaie de créer un outil de requête dynamique à l'aide de System.Linq.Expressions.Expression (WPF / c # 4.0). Il s'exécute sur un service OData.

Jusqu’à présent, tout fonctionne tant que je limite les conditions pour intégrer des options telles que Equal (..), GreaterThan (..), etc. Il semble qu’il n’existe pas de condition contient / Like, alors j’ai essayé de construire la mienne. Il existe déjà une poignée d'articles. Une que j'ai essayée est Comment créer une System.Linq.Expressions.Expression pour Like? .

Maintenant, si j'utilise la solution ci-dessus, le résultat où expression est

whereCallExpression = {Convert([10000]).Expand("A,B").Where(clt => MyLike(clt.LastName, "te"))}'

ce qui est bien, mais faux, car cela ne se traduit pas par une requête Odata valide.

Si j'utilise la condition 'Equal', le résultat est

whereCallExpression = {Convert([10000]).Expand("A,B").Where(clt => (clt.LastName == "te"))}

qui aboutit à la requête OData

results = {http://.../Clients()?$filter=LastName eq 'te'&$expand=A,B} 

et fonctionne comme prévu.

Est-ce que je fais quelque chose de mal avec la mise en œuvre de la solution, ou ne peut-on pas l'utiliser avec OData?

Il devrait transférer à quelque chose comme ...?$filter=substringof('te', LastName ) eq true

Toute solution sur la façon de résoudre ce problème?

Cordialement

Andreas

PS, j’ai implémenté l’extension de la solution dans une classe statique, tout ce que j’ai changé est le nom de la méthode appelée, de 'Like' à 'MyLike'. , Je suppose, pour le moment, cette partie est ok. Je peux poster des parties si nécessaire

Réponse acceptée

Actuellement, OData ne supporte pas l'opérateur "like". Donc, peu importe ce que vous faites sur le client, l'URL produite n'a pas le moyen de l'exprimer. La sous-chaîneof est prise en charge et le fournisseur LINQ client doit la générer lorsque vous utilisez la méthode string.Contains dans votre expression filter (Where).

Pour obtenir l'expression générée par un compilateur C #, vous pouvez faire quelque chose comme ceci:

IQueryable<string> source = new List<string>().AsQueryable();
IQueryable<string> result = from item in source where item.Contains("John") select item;
Console.WriteLine(result.Expression.ToString());

Fondamentalement, tout IQueryable a une propriété Expression qui contient l’arbre d’expressions à exécuter par la requête. Certains fournisseurs LINQ peuvent modifier quelque peu l'arborescence d'expression par rapport à celle créée par le compilateur, mais la plupart doivent la laisser proche de l'original.



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi