表达式与Lambdas

时间:2011-08-22 15:10:54

标签: c# .net expression

我知道什么是Lambda表达式。

但我不确定这是否与Expression相同。这里似乎还有更多要知道的事情。

我正在查看wrapping IQueryable并且使用表达式很多。那么,例如,这里的“表达式”参数还有更多可以在Lambda中想到的吗?

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

2 个答案:

答案 0 :(得分:4)

lambda表达式是一个编译器功能,根据上下文编译成两件事之一:

  • (隐藏)功能及其代理
  • Expression

一旦编译了应用程序,lambda表达式的概念就不存在了,因为它已被转换为上述两个选项之一。

我不确定你的意思

  

这里的“表达式”参数还有更多内容,而不是Lambda中可以想到的

表达式以可检查的形式封装和表达应用程序逻辑(换句话说,它让您可以看到开发人员根据调用的属性和函数,包含的常量,比较等)编写的内容。这就是查询提供程序(大多数情况下,对象关系映射器,如实体框架)如何获取代码并将其转换为SQL。

答案 1 :(得分:1)

Lambda通常是编译代码,其中Expression表示“抽象语法树”(AST),即。表示代码的数据结构,可以编译为代码。 IQueryable通常在Expression上运行,因为它应该将AST编译为在不同环境中运行的代码,例如SQL服务器,而不仅仅是主机。 IQueryableProviders可以编译为SQL(Linq2Sql),JavaScript,OpenGL着色器(Bling)等等。

如果method参数需要一个正确类型的表达式,C#编译器有时可以将lambda转换为表达式:

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