2010-03-05 6 views
6

Je ne sais pas si c'est possible ... mais ce serait cool. la question est de savoir si c'est possible mais ensuite un peu d'exemple si possible.Je veux être capable d'utiliser une expression lambda pour spécifier une plage de valeurs à retourner sur un service wcf

Je ne suis pas sûr de la méthode utilisée pour transmettre l'expression lambda.

Par exemple, la méthode IList<Group> GetGroups()

Comment voulez-vous modifier que pour être en mesure de passer une expression lambda en elle?

La question suivante est comment vous codez une expression lambda renvoyer tous les objets du groupe où, par exemple

  • where .deleted == false ou
  • where .DateAdded > aDate

Oui, je veux la lune sur un bâton ;) Merci d'avance.

(edit Je pense que c'est un peu mal conçu à cause de la couche d'accès aux données qui va récupérer les données ... mais supposons que vous interrogez une collection d'objets sur le service et n'avez pas à s'inquiéter pour le dal).

Répondre

7

Vous pouvez déclarer la méthode GetGroups avec un paramètre de type Expression<Func<Group, bool>>, ce qui représente un prédicat que le groupe doit correspondre à pour être retourné:

IList<Group> GetGroups(Expression<Func<Group, bool>> predicateExpression); 

le problème est, les expressions ne peuvent pas être sérialisés, de sorte que vous ne pouvez l'envoyer au service WCF ... Cependant, vous pourriez trouver un moyen de le faire avec le Expression Tree Serialization projet.

+0

winnah merci à la fois. Avoir écrit quelque chose de similaire pour un jeu précédemment .... –

0

Vous pouvez transmettre un "prédicat": A Func<Group, bool>, qui renvoie true ou false pour un groupe donné. Comme vous pouvez passer un lambda où un Func devrait, cela pourrait être quelque chose comme:

var fooGroups = GetGroups(g => g.Name.StartsWith("Foo"));

+2

Et comment comptez-vous sérialiser le délégué pour l'envoyer au service WCF? –

+0

acclamations;) Je ne comprends toujours pas ce que serait la signature de méthode de GetGroups. –

+0

Merci, Thomas - mon mauvais. –

1

Je pense que les services RIA font ce que vous voulez, mais je ne connais pas la magie derrière cela.

2

Vous pouvez

  • définir un langage de requête simple que votre service back-end comprend
  • le service Web expose une méthode qui prend une chaîne dans cette langue de requête
  • écrire une conversion côté client système qui prend dans un IQueryable plein d'arbres d'expression, et traduit cela dans le langage de requête
  • maintenant le client peut soit écrire des requêtes dans votre langage de requête directement, ou peut écrire des requêtes LINQ que votre traducteur transforme dans votre langage de requête
  • hey, vous venez d'inventer LINQ-To-Tortoise!

Matt Warren a seventeen blog articles sur la façon de faire ce genre de chose.

+0

lol linq-To-Tortoise ... ressemble à une bête dangereuse. J'ai tendance à m'écarter des langages de script personnalisés - vous abandonnez beaucoup de contrôle et vous suppliez de causer d'énormes problèmes à l'avenir. Mais je vais regarder dans IQueryable beaucoup plus ... merci. –

Questions connexes