9
votes

Utiliser des arbres d'expressions Lambda avec iEnumérables

J'essaie d'apprendre davantage sur l'utilisation d'arbres d'expression de Lamba et j'ai donc créé un exemple simple. Voici le code, cela fonctionne sous Linqpad si collé en tant que programme C #.

IEnumerable<User> list = GetUsers().Where(u => u.Name.Contains("a"));


0 commentaires

4 Réponses :


2
votes

Modifier le type de retour de Namecontains à partir de Expression > Pour simplement FUNC . Dans cette situation, il n'est pas nécessaire de retourner l'expression, vous souhaitez réellement retourner le délégué compilé. Il y a une différence entre l'expression qui constitue la Lambda et la Lambda (qui est un délégué) lui-même.

Si vous envoyez une méthode Lambda dans une méthode, la méthode peut accepter la Lambda sous forme d'expression, soit en tant que type de délégué compilé, en fonction de ce que vous spécifiez dans les paramètres. Si le type de paramètre entrant est une expression, vous pouvez envoyer quelque chose qui ressemble à un délégué, si la méthode s'attend à un délégué, vous devez lui donner un délégué compilé, pas simplement une expression. Cela étant dit, vous pouvez aussi faire quelque chose comme: xxx

qui compilait l'expression et renvoie un func . < / p>


0 commentaires

6
votes

Le énumérable.Où Méthode prend un FUNC , pas un Expression > . Peut-être que vous êtes déroutant avec requérissant.Où , qui prend une expression en tant que paramètre ... Dans votre cas, vous n'avez pas besoin d'une expression, vous avez juste besoin d'un délégué qui peut être exécuté contre chaque article dans la séquence. Le but des expressions est (principalement) à analyser et à traduire en quelque chose d'autre (SQL par exemple), à ​​effectuer la requête contre une source de données externe


4 commentaires

Oui, c'est exactement ce que j'ai mal fait. Je pense que j'ai encore besoin de faire plus de lecture sur ce sujet pour essayer de mieux le comprendre. Mon autre exemple utilisait iquéryable et cela fonctionnait bien, lorsque j'ai construit un nouvel exemple en utilisant une liste iEnumerable, cela ne fonctionnerait pas. Je ne suis pas sûr de ce que le mot clé d'expression est destiné à signifier.


Le fait que les expressions de Lambda soient considérées comme un délégué ou une arborescence d'expression dépend du contexte. Dans votre code, vous déclarez le type de retour comme expression, ce qui indique au compilateur de considérer l'expression de Lambda en tant qu'arbre d'expression plutôt qu'un délégué exécutable. BTW, expression n'est pas un mot clé, c'est un type


D'oh ... Tapez pas de mots-clés. Merci Thomas.


J'ai trouvé cet article dans une autre poche Stackoverflow expliquant plus en détail les arbres d'expression. Maintenant, je comprends la différence fondamentale entre ce que je faisais et simplement en utilisant Func, je vais approfondir des arbres d'expression plus en détail. blogs.msdn.com/charlie/archive/ 2008/01/31 / ...



0
votes

Les expressions Lambda peuvent être traitées comme un code (délégués) ou sous forme de données (arbres d'expression)

Dans votre exemple, vous tentez de traiter l'expression Lambda en tant que code.

Vous utiliseriez l'expression <> Déclaration lorsque vous souhaitez traiter l'expression Lambda en tant que données.

Pourquoi voudriez-vous faire cela?

Voici une citation du livre Linq en action,

"Les arbres d'expression peuvent être donnés aux outils au moment de l'exécution, qui les utilisent pour guider leur exécution ou les traduisent en quelque chose d'autre, tel que SQL dans le cas de LINQ à SQL. "

Utilisation des arbres d'expression vous permet de prendre l'expression Lambda et de le convertir en données, c'est ainsi que LINQ to SQL fonctionne, il prend les opérateurs d'expression Lambda ou de requête ou les expressions de requête et les convertit vers SQL. Vous pouvez bien sûr afficher et modifier l'arborescence d'expression créée une fois convertie en SQL.


1 commentaires

Ok, cela m'aide à comprendre cela un peu mieux. Je peux voir pourquoi mon autre exemple traitant de Linq à SQL et un retour iquérisable d'une table fonctionnerait avec l'expression de type de réveil maintenant.



0
votes

Il y a une énorme différence entre expression et func <...>, le FUNC est un délégué pur que vous pouvez l'invoquer directement, l'expression est une structure de données contenant des informations sur une expression comme des informations sur la syntaxe Lambda ou Linq ( par exemple de x dans la liste où x.id = 1 sélectionnez x). L'expression ne peut pas être invoquée directement elle doit être compilée en premier, les expressions seraient utilisées pour convertir l'expression d'une manière à un autre lien similaire à SQL, ce qui convertit une expression en déclarations SQL, la meilleure façon de le faire pour changer le type de retour de Namecontains. PROCÉDÉ DU FUNC INDIQUÉ DE L'EXPLOIRE CUZ Vous travaillez avec Linq vers des objets, mais lorsque vous utilisez avec LINQ vers SQL, vous pouvez utiliser Expression ou Func.


0 commentaires