Comment puis-je passer une expression lambda à un service WCF?
Mon projet actuel est à l'aide de la IDesign de l'architecture, de sorte que tous mes calques sont des services. Je voulais avoir ma méthode de Lecture dans le CRUD de mon accès aux ressources de la couche de prendre un prédicat sous la forme d'une expression lambda ainsi qu'une liste d'objets liés à tirer. De cette façon, l'accès aux ressources de la couche qui va être très générique.
[OperationContract]
Result<MyObject> ReadObjects(Func<MyObject, bool> predicate, string[] includes);
Maintenant, je viens de découvrir quelque chose qui devrait être évident, c'est que je ne peux pas sérialiser les expressions lambda. J'ai regardé dans l'analyse d'une chaîne de caractères dans une expression lambda, mais c'est un no go.
Est il une méthode que je peux utiliser pour passer d'une expression lambda à un service? Est-il une meilleure façon de faire ce que je suis en train de faire?
source d'informationauteur OpticalDelusion
Vous devez vous connecter pour publier un commentaire.
Peut-être d'une requête dynamique pourrait fonctionner dans votre situation?
http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx
Vous voulez passer une clause where de la chaîne de service qui permettrait de valider et de le convertir à une expression
Que nous avons à résoudre ce problème dans LINQ-à-Tout-Sur-Tout. Par exemple, lorsque vous faites des LINQ-to-SQL:
en quelque sorte le contenu de la lambdas
c=>c.City == "London"
etc=>c.Name
besoin pour finir sur le serveur SQL dans un formulaire, le serveur comprend. Clairement on ne peut pas persister lambdas pour le serveur.Au lieu de ce que nous avons à faire est de tourner les lambdas dans les Arborescences d'Expression, d'analyser l'expression des arbres au moment de l'exécution, de construire une chaîne de SQL, et envoyer cette chaîne au serveur pour traitement.
Vous pouvez faire la même chose. Créer un langage de requête pour votre serveur. Sur le côté client, tourner les lambdas dans les arbres d'expression. Analyser lors de l'exécution, mettez le résultat dans une chaîne de caractères dans votre langage de requête, puis envoyer la requête au service.
Si vous êtes intéressé à savoir comment cela fonctionne dans LINQ, le LINQ-to-SQL architecte Matt Warren a écrit une longue série d'articles de blog sur la façon de le faire vous-même:
http://blogs.msdn.com/b/mattwar/archive/2008/11/18/linq-links.aspx
WCF n'offre pas cette sortie de la boîte. Vous serait essentiellement pour écrire un personnalisé sérialiseur qui a pris les expressions lambda et se tourna de l'arborescence d'expression dans un serializable morceau de données.
C'est de cette façon WCF data services œuvres. Vous utilisez des lambdas dans votre code client, il se décompose ces expressions lambda dans les chaînes de laquelle il passe sur la chaîne de requête pour le service de données qui tourne alors la chaîne de retour dans une lambda qui elle s'applique à un IQueryable sur le côté serveur.
Faisable, mais vous aurez à écrire beaucoup de code de sérialisation personnalisée pour cela. Aussi, soyons clair, il serait lamdba expressionspas de plein lambda méthodes contenant du code aléatoire qui ne pourrait jamais être exécuté du côté serveur.
- Je utiliser cette bibliothèque sur CodePlex pour sérialiser/désérialiser des arbres d'Expression (mais la version précédente), et il fait le travail.
Il y a aussi quelques autres questions comme celle-ci:
La sérialisation et la Désérialisation des Arbres d'Expression en C#
Créer un Objet De Requête et de le passer à votre services.
Voir si cela aide:
http://ruijarimba.wordpress.com/2011/05/09/entity-framework-and-t4-generate-query-objects-on-the-fly-part-1/
Un exemple:
J'ai trouvé un projet open source en codeplex est la solution de ce problème comme sujet
Arborescence D'Expression Sérialiseur
Description Du Projet
un .NET 4.0 et Silverlight 4 bibliothèque de classe qui sérialise et désérialise Expression instances. Aussi: un WCF IQueryable LINQ Fournisseur et Web Http (REPOS) client pour Silverlight qui simplifie client REST API (c'est à dire de la WCF WebChannelFactory) c'est plus facile à utiliser que WebClient.
sur ce lien
http://expressiontree.codeplex.com/