2011-08-22 14 views
5

sé lo que es una expresión lambda.Expresiones vs Lambdas

Pero no estoy seguro si eso es lo mismo que un Expression. Parece que hay más que saber aquí de lo que sé.

estoy mirando wrapping IQueryable y que utiliza expresiones mucho. Entonces, por ejemplo, ¿hay algo más aquí en el parámetro 'Expresión' de lo que se puede pensar en un Lambda?

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

Respuesta

4

Una expresión lambda es una característica del compilador que se compila, dependiendo del contexto, en una de dos cosas:

función
  • A (oculto) y un delegado para que
  • Un Expression

Una vez que la aplicación ha sido compilada, el concepto de una expresión lambda no existe, como ha sido tu en una de las dos opciones anteriores.

no estoy seguro de lo que entendemos por

hay más al parámetro 'expresión' aquí que se puede pensar en una Lambda

Una expresión encapsula y expresó lógica de la aplicación en una forma inspeccionable (en otras palabras, le permite ver lo que el desarrollador escribió en términos de propiedades y funciones invocadas, constantes incluidas, comparaciones, etc.). Así es como los proveedores de consultas (en su mayor parte, mapeadores relacionales de objetos como Entity Framework) toman el código y lo convierten en SQL.

+0

+1 excelente respuesta. Spot on !!! – gideon

1

Lambdas están generalmente código compilado, donde la expresión representa "árboles de sintaxis abstracta" (AST), es decir. una estructura de datos que representa el código, y puede compilarse para codificar. IQueryable generalmente opera en Expression porque se supone que compila el AST para codificar que se ejecuta en diferentes entornos, como un servidor SQL, en lugar de solo la máquina host. Hay IQueryableProviders que se compilan en SQL (Linq2Sql), JavaScript, sombreadores OpenGL (Bling) y más.

El compilador de C# a veces puede convertir una lambda en una expresión, si el parámetro método espera una expresión del tipo correcto:

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

"Lambdas generalmente se compilan código" Esto es incorrecto, mientras que lambdas sin duda puede ser utilizado para crear el código compilado (se convierten en delegados a funciones ocultas, generados por el compilador), que también se utilizan para crear objetos 'Expression'; cualquiera que sea creado se determina por el contexto. No voy a votar, ya que su información en AST es ciertamente correcta, pero la primera oración implica que hay una diferencia entre Lambdas y Expressions. –

+0

Énfasis en el * generalmente *. El poder expresivo total de lambdas solo está disponible para los delegados en este momento, porque "enunciado lambdas" no puede compilarse a expresiones. La expresión es un subconjunto empobrecido de lambdas. También estimaría que la mayoría del uso de lambda es System.Linq, que usan delegados, pero quizás estoy sesgado en esa estimación. – naasking

+0

No estaría de acuerdo allí; Creo que la mayoría de los estados LINQ vienen como parte de las consultas LINQ-to-SQL o Entity Framework (otro ORM obviamente soporta la sintaxis de expresión, también, pero yo no piensan que su uso es ni de lejos tan alto como EF o L2S).Creo que el hecho de que la abrumadora mayoría de las preguntas "LINQ" en StackOverflow haga referencia a uno de esos dos marcos (EF está comenzando a tomar el relevo ya que la mayoría comparte, pero L2S no se queda atrás). –