2011-08-22 18 views
5

So cosa è un'espressione Lambda.Expressions vs Lambdas

Ma non sono sicuro che sia la stessa cosa di Expression. Sembra che ci sia più da sapere qui di quanto io sappia.

Sto guardando wrapping IQueryable e che usa molto le espressioni. Quindi, per esempio, qui c'è più del parametro "Espressione" di quanto si possa pensare in un Lambda?

public InterceptedQuery(InterceptingProvider provider, Expression expression) 
{ 
    this._provider = provider; 
    this._expression = expression; 
} 

risposta

4

Un'espressione lambda è una caratteristica compilatore che viene compilato, a seconda del contesto, in una delle due cose: funzione

  • A (nascosta) e un delegato ad esso
  • An Expression

Una volta che l'applicazione è stata compilata, il concetto di espressione lambda non esiste, come è stato tu inserito in una delle due opzioni di cui sopra.

io non sono sicuro di cosa si intende per

c'è di più al parametro 'Expression' qui che può essere pensato in un Lambda

Un'espressione incapsula e hanno espresso la logica dell'applicazione in una forma ispezionabile (in altre parole, consente di vedere ciò che lo sviluppatore ha scritto in termini di proprietà e funzioni invocate, costanti incluse, confronti, ecc.). Questo è il modo in cui i provider di query (per la maggior parte, i mappatori di oggetti relazionali come Entity Framework) prendono il codice e lo trasformano in SQL.

+0

+1 risposta eccellente. Spot on !!! – gideon

1

Lambdas è un codice generalmente compilato, in cui Expression rappresenta "abstract syntax trees" (AST), ovvero. una struttura dati che rappresenta il codice e può essere compilata in codice. IQueryable opera generalmente su Expression perché deve compilare il codice AST per eseguire il codice in ambienti diversi, ad esempio un server SQL, anziché solo il computer host. Ci sono IQueryableProviders che compilano in SQL (Linq2Sql), in JavaScript, in shader OpenGL (Bling) e altro.

Il C# compilatore volte può trasformare un lambda in un'espressione, se il parametro metodo prevede un'espressione del tipo giusto:

void Foo(Expression<Func<int>>) { ... } 
... 
Foo(() => 3); 
+0

"Lambdas sono generalmente codice compilato" Questo non è corretto, mentre i lambdas possono certamente essere usati per creare codice compilato (diventano delegati a funzioni nascoste e generate dal compilatore), vengono anche usati per creare oggetti 'Expression'; qualunque sia creato è determinato dal contesto. Sto andando verso il basso, dal momento che le tue informazioni su AST sono certamente corrette, ma la prima frase implica che c'è una differenza tra Lambdas e le espressioni. –

+0

Enfasi su * generalmente *. Il pieno potere espressivo di lambda è disponibile solo per i delegati al momento, perché "dichiarazione lambda" non può essere compilato per le espressioni. L'espressione è un sottoinsieme impoverito di lambda. Stimo anche che la maggior parte dell'uso di lambda è System.Linq, che usa delegati, ma forse sono parziale su quella stima. – naasking

+0

Non sarei d'accordo; Penso che la maggior parte delle istruzioni LINQ faccia parte delle query LINQ-to-SQL o Entity Framework (anche gli altri ORM supportano ovviamente anche la sintassi di Expression, ma non credo che il loro utilizzo sia pressoché alto come EF o L2S).Penso che il fatto che la stragrande maggioranza delle domande "LINQ" su StackOverflow facciano riferimento a uno di questi due framework (EF sta iniziando a prendere il sopravvento come quota di maggioranza, ma L2S non è una soluzione). –