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;
}
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);