Arbre d'expression

asp.net c# expression-trees

Question

Ma compréhension de l'arbre d'expression est la suivante:

Les arbres d'expression sont des représentations en mémoire d'expressions telles que des expressions arithmétiques ou booléennes. Les expressions sont stockées dans l'arbre analysé. Nous pouvons donc facilement les traduire dans un autre langage.

Linq to SQL utilise l'expression tree.Normalement dans la requête LINQ to SQL le compilateur le traduit en arborescence d'expression analysée. Celles-ci sont transmises au serveur SQL sous forme d'instructions T-SQL. Le serveur SQL exécute la requête T-SQL et renvoie le résultat. C’est pourquoi, lorsque vous exécutez LINQ to SQL vous obtenez IQueryable<T> non IEnumetrable<T> .Parce que IQuerybale contient

public IQueryable:IEnumerable
{

   Type Element {get;}
   Expression Expression {get;}
   IQueryaleProvider Provider {get;}
}

Des questions :

  1. Microsoft utilise les arbres d’expression pour jouer avec LINQ-to-Sql. Quelles sont les différentes manières d’utiliser des arbres d’expression pour booster mon code?

  2. À part LINQ to SQL, Linq to amazon, qui a utilisé des arbres d’expression dans leurs applications?

  3. Linq to Object renvoie IEnumerable, Linq to SQL return IQueryable, que renvoie LINQ to XML?

Réponse acceptée

Les arborescences d'expression offrent un moyen d'inspecter une partie du code avant sa compilation, au moment de l'exécution.

Vous pouvez faire exactement deux choses avec un arbre d'expression:

  • Compilez-le en un délégué à l'aide de Expression.Compile ou
  • Visitez les nœuds d’arbre et générez-en autre chose (c’est-à-dire une instruction SQL).

Les arbres d’expression sont sympas, mais ils ont peu de chances d’être directement utiles à un site Web typique ou à une application d’entreprise. Vous ne les utiliseriez que lorsque vous (a) souhaitez générer un type de code différent de celui de la source C # au moment de l'exécution, ou (b) souhaitez utiliser Reflection, tout en fournissant une mesure de la sécurité au moment de la compilation.

Si vous travaillez sur des bibliothèques réutilisables - frameworks DI, frameworks AOP, frameworks MVC / MVP / MVVM, frameworks ORM, etc., ou tentez d'étendre l'un de ces frameworks (y compris Linq-to-XYZ), vous aurez probablement une utilisation pour les arbres d’expression (tels que l’extension de mise à jour par lots Linq vers SQL), bien qu’il soit difficile de discuter d’ exemples spécifiques car cela dépend entièrement de la conception d’un tel framework.

Si vous ne construisez pas ce type d’outils, alors les arbres d’expression ne sont guère plus qu’une curiosité. Bien sûr, il est bon d’apprendre, mais ne soyez pas déçu si vous ne trouvez pas trop d’utilisations pratiques pour eux.

Quelques exemples de bibliothèques qui utilisent des arbres d'expression:

... Cela devrait vous donner une idée du type de projets qui utilisent sérieusement les arbres d'expression. Donc, si vous construisez votre propre environnement d’exécution ou votre MVC, vous voulez absolument tout apprendre. ;)


Réponse populaire

  1. Qu'entendez-vous par "booster mon code"?
    Les arbres d'expression n'augmenteront pas (généralement) les performances; ils sont utilisés pour activer des fonctionnalités supplémentaires.
  2. Les arbres d'expressions n'ont rien à voir avec LINQ. Par exemple, ils sont utilisés par les systèmes d'injection de dépendance pour spécifier des types et fonctionner efficacement.
  3. LINQ to XML renvoie IEnumerable<XElement> .



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