Expressions vs Lambdas

本文关键字:Lambdas vs Expressions | 更新日期: 2023-09-27 18:06:25

我知道什么是Lambda表达式

但我不确定这是否与Expression相同。这里要知道的似乎比我知道的要多。

我正在看包装IQueryable,它使用表达式很多。那么,例如,这里的'Expression'参数是否比Lambda中可以想到的更多?

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

Expressions vs Lambdas

lambda表达式是一个编译器特性,根据上下文,它被编译成以下两种情况之一:

  • 一个(隐藏的)函数和它的委托
  • An Expression

一旦编译完应用程序,lambda表达式的概念就不存在了,因为它已经变成了上面两个选项之一。

我不知道你说的

是什么意思

这里的'Expression'形参是否比Lambda

中考虑的更多?

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

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

如果方法形参需要正确类型的表达式,c#编译器有时可以将lambda转换为表达式:

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