Albero delle espressioni

asp.net c# expression-trees

Domanda

La mia comprensione dell'albero delle espressioni è:

Gli alberi di espressione sono la rappresentazione in memoria dell'espressione come l'espressione aritmetica o booleana. Le espressioni sono memorizzate nell'albero analizzato. Quindi possiamo facilmente transalizzare in qualsiasi altra lingua.

Linq to SQL utilizzato l'albero delle espressioni. Normalmente nella query LINQ to SQL il compilatore lo traduce in alberi di espressioni analizzate. Questi vengono passati a SQL Server come istruzioni T-SQL. Il server Sql esegue la query T-SQL e restituisce il risultato. Ecco perché quando esegui LINQ to SQL ottieni IQueryable<T> not IEnumetrable<T> . Perché IQuerybale contiene

public IQueryable:IEnumerable
{

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

Domande :

  1. Microsoft utilizza gli alberi di espressione per giocare con LINQ-to-Sql. Quali sono i diversi modi in cui posso utilizzare gli alberi di espressione per aumentare il mio codice.

  2. Oltre a LINQ to SQL, da Linq ad Amazon, chi ha utilizzato gli alberi di espressione nelle proprie applicazioni?

  3. Ritorno da Linq a Object IEnumerable, ritorno da Linq a SQL IQueryable, Cosa restituisce LINQ to XML?

Risposta accettata

Gli alberi di espressione offrono un modo per esaminare una parte di codice prima che sia effettivamente compilato, in fase di esecuzione.

Puoi fare esattamente due cose con un albero di espressioni:

  • Compilalo in un delegato, usando Expression.Compile o
  • Visita i nodi dell'albero e genera qualcos'altro da esso (cioè un'istruzione SQL).

Gli alberi delle espressioni sono fantastici, ma le probabilità che abbiano effettivamente un'utilità diretta per un tipico sito Web o un'app aziendale sono remote. Li useresti solo quando tu (a) vuoi generare un diverso tipo di codice da C # source al runtime, o (b) vuoi usare Reflection ma fornire una certa misura della sicurezza in fase di compilazione.

Se stai lavorando su librerie riutilizzabili - quadri DI, quadri AOP, quadri MVC / MVP / MVVM, quadri ORM e così via, o cercando di estendere uno di questi quadri (incluso Linq-to-XYZ), allora probabilmente troverai un uso per gli alberi di espressione (come l'estensione di aggiornamento batch Linq a SQL), sebbene sia difficile discutere di esempi specifici perché dipenderebbe interamente dalla progettazione di tale framework.

Se non stai costruendo questo tipo di strumenti, allora gli alberi di espressione non sono molto più di una curiosità. Ovviamente è bello conoscerlo - ma non essere deluso se non trovi troppi usi pratici per loro.

Alcuni esempi di librerie che usano gli alberi di espressione:

... Questo dovrebbe darti un'idea del tipo di progetti che fanno un uso serio degli alberi di espressione. Quindi, se stai costruendo il tuo ambiente di runtime o MVC, sicuramente vuoi imparare tutto ciò che puoi. ;)


Risposta popolare

  1. Cosa intendi con "boost my code"?
    Gli alberi delle espressioni non aumentano (di solito) le prestazioni; sono utilizzati per abilitare funzionalità aggiuntive.
  2. Le espressioni alberi non hanno nulla a che fare con LINQ. Ad esempio, vengono utilizzati dai sistemi di iniezione delle dipendenze per specificare i tipi e le funzioni in modo efficiente.
  3. LINQ to XML restituisce IEnumerable<XElement> s.


Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché