2011-08-22 79 views
5

我知道Lambda表达式是什么。我不确定这是否与Expression相同。这里知道的东西似乎还比我知道的要多。表达式与Lambdas

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

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

回答

4

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

  • A(隐藏)功能和委托给它
  • Expression

一旦应用程序被编译,lambda表达式的概念是不存在的,因为它已经TU归入上述两种选择之一。

我不知道你所说的

的意思是有更多的“表达”参数在这里比在拉姆达

的表达式封装被认为并表示应用程序逻辑以一种可检查的形式(换句话说,它可以让你看到开发人员在所调用的属性和函数,包括常量,比较等方面写的内容)。这就是查询提供者(大多数情况下,像实体框架这样的对象关系映射器)获取代码并将其转换为SQL的方式。

+0

1优良的答案。发现!!! – gideon

1

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

C#编译有时可以把一个lambda到表达,如果该方法参数期望的权利类型的表达式:

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

“Lambdas通常是编译代码”这是不正确的,而lambda当然可以用来创建编译代码(它们成为隐藏的,编译器生成的函数的委托),它们也用于创建'Expression'对象;无论哪一个都是由上下文决定的。因为你关于AST的信息当然是正确的,但第一句话意味着Lambdas和表达式之间有区别。 –

+0

强调*一般*。 lambda表达式的全部表现力目前仅供委托人使用,因为“statement lambdas”不能编译为表达式。表达式是lambdas的一个贫穷的子集。我也估计大部分lambda使用是System.Linq,它使用委托,但也许我偏向于这个估计。 – naasking

+0

我不赞同那里;我认为大部分LINQ语句都是作为LINQ-to-SQL或实体框架查询的一部分(其他ORM显然也支持Expression语法,但我不认为它们的用法几乎与EF或L2S一样高)。我认为绝大多数关于StackOverflow的“LINQ”问题都引用了这两个框架之一(EF正在开始接管大部分的份额,但L2S并不是懒惰)。 –