> et Func <> [dupliquer]'/> > et Func <> [dupliquer]'/> > et Func <> [dupliquer]'/> Différence entre l'expression <Func <>> et Func <> [dupliquer] | abulletproofidea.com

Question Différence entre l'expression > et Func <> [dupliquer]


Cette question a déjà une réponse ici:

Par exemple, pourquoi la plupart des opérateurs LINQ acceptent-ils Expression<Func<TSource>> et son équivalent Func<TSource>?

Quel est l'avantage / la raison d'utiliser le générique Expression classe au lieu de la syntaxe lambda


72
2018-04-19 01:57


origine


Réponses:


En utilisant Expression<T> vous créez explicitement un arbre d'expression - Cela signifie que vous pouvez gérer le code qui constitue la requête comme s'il s'agissait de données.

La raison en est que les fournisseurs LINQ (comme LINQ to SQL, par exemple) inspectent la requête elle-même pour déterminer la meilleure façon de traduire les expressions C # en une requête T-SQL. Comme une arborescence d'expression vous permet de regarder le code en tant que données, le fournisseur peut le faire.


59
2018-04-19 01:59



En résumé, les principales différences entre les deux sont les suivantes:

  • Expression<Func<...>> est un arbre d'expression qui représente le code source d'origine (il est stocké dans une structure de données arborescente très proche du code C # d'origine). Dans ce formulaire, vous pouvez analyser le code source et des outils tels que LINQ to SQL peuvent traduire l'arborescence (code source) dans d'autres langages (par exemple, SQL dans le cas de LINQ to SQL, mais vous pouvez également cibler, par exemple, JavaScript).

  • Func<...> est un délégué ordinaire que vous pouvez exécuter. Dans ce cas, le compilateur compile le corps de la fonction en langage intermédiaire (IL), tout comme lors de la compilation de la méthode standard.

Il est important de mentionner que Expression<..> a un Compile méthode qui compile l'expression au moment de l'exécution et génère Func<...>, il y a donc une conversion du premier au deuxième (avec un coût de performance). Cependant, il n'y a pas de conversion du second au premier, car une fois que vous obtenez IL, il est très difficile (impossible) de reconstruire le code source d'origine.


30
2018-04-19 02:09



Func<T> crée une fonction exécutable.

Expression<Func<T>> crée un arbre d'expression qui vous permet de travailler avec le code dans la fonction en tant que données.

Les arbres d'expression vous permettent de faire des choses comme LINQ to SQL et LINQ to XML en générant les appels sous-jacents à partir de votre code .NET.


15
2018-04-19 02:02



Un Expression<Func<>> est la représentation d'une fonction qui doit encore être transformée en code. UNE Func<> est une fonction exécutable réelle. L'utilisation du premier permet de transformer l'expression en fonction appropriée au moment où elle est appelée. Par exemple, avec LINQ to SQL, cela le traduira en code équivalent pour exécuter une instruction SQL et renvoyer le contenu spécifié. Avec LINQ to objects, il exécutera du code sur le client en utilisant le CLR. UNE Func<> est toujours exécuté dans le code exécutable du CLR.


7
2018-04-19 02:06