LINQ中的表达式树是什么?

LINQ中的表达式树是什么?,linq,Linq,LINQ中的表达式树是什么?有人能给我指出一个有代码和解释的资源吗?表达式树是一个所有节点都是s的树(请放心) 我不完全确定您是否在询问表达式树的具体应用,因此这有点冗长,但应该给出使用它们的一般方法。MSDN有一些,并且在中始终有实际类的文档。我相信当我第一次看到这些表达时,我发现它们很有用,但我没有正确地回忆起来 您可能熟悉语法树的概念。例如,2+2通常可视为具有语法树: + / \ 2 2 表达式树在概念上非常相似。是一个笑脸树,其中所有节点都是一个表达式。表达式2+2将由代码

LINQ中的表达式树是什么?有人能给我指出一个有代码和解释的资源吗?

表达式树是一个所有节点都是s的树(请放心)

我不完全确定您是否在询问表达式树的具体应用,因此这有点冗长,但应该给出使用它们的一般方法。MSDN有一些,并且在中始终有实际类的文档。我相信当我第一次看到这些表达时,我发现它们很有用,但我没有正确地回忆起来

您可能熟悉语法树的概念。例如,
2+2
通常可视为具有语法树:

  +
 / \
2   2
表达式树在概念上非常相似。是一个笑脸树,其中所有节点都是一个表达式。表达式
2+2
将由代码表示

Expression.Add(Expression.Constant(2), Expression.Constant(2))
它返回一个
二进制表达式
,是一个表达式树


表达式 Lambda表达式也经常使用表达式(当它们被使用时)

这是lambda语句或lambda块:

i => {return i * 2;}
这是一个lambda表达式:

i => i * 2
您可能已经习惯于看到上面的代码接下来的类型是
Func

Func<int, int> timesTwo = i => i * 2;
但是,由于表达式尚未编译,因此可以对其进行检查和/或操作。例如,我可以检查表达式的主体并确认乘法常数实际上是2

Expression<Func<int, int>> timesTwoExpression = i => i*2;
Assert.True(timesTwoExpression.Body.NodeType == ExpressionType.Multiply);
Expression right = ((BinaryExpression) timesTwoExpression.Body).Right;
Assert.True( right.NodeType == ExpressionType.Constant);
Assert.AreEqual( ((ConstantExpression) right).Value, 2);
Expression timesTwoExpression=i=>i*2;
True(timesTwoExpression.Body.NodeType==ExpressionType.Multiply);
表达式权限=((BinaryExpression)timesTwoExpression.Body);
Assert.True(right.NodeType==ExpressionType.Constant);
断言.AreEqual(((ConstantExpression)right).Value,2);
我个人使用过它,并在泛型类型上指定类型参数,而该类型仅在运行时已知。注意:我不能保证这些链接问题的具体答案,我没有对照我编写的代码检查它们;我提供它们只是为了参考和举例

这只允许访问表达式API的有限部分(您只能将其用于Lambda表达式,而不能用于Lambda语句),但它仍然非常有用。但是,这是一个高级功能,您的所有团队可能都不理解它,所以请负责任地使用它


LINQ查询的表达式 表达式是LINQ的一部分。然而,LINQ包含了相当多的C#特性,包括查询语法、lambdas、泛型委托和表达式

LINQ查询在封面下使用表达式来提供与
IQueryable.
相关的一些行为,例如,C#code(表达式)被重写并作为SQL执行。你可以从和开始,但这涉及到很多问题


用于动态代码/语言实现的表达式

我知道表达式API最终足够健壮,能够表示大多数语言结构,并作为实现动态/解释语言的基础;虽然我从未以这种身份使用过它。有关此用途的更多信息,请参见与本手册相关的资料

Func<int, int> timesTwo = timesTwoExpression.Compile()
Expression<Func<int, int>> timesTwoExpression = i => i*2;
Assert.True(timesTwoExpression.Body.NodeType == ExpressionType.Multiply);
Expression right = ((BinaryExpression) timesTwoExpression.Body).Right;
Assert.True( right.NodeType == ExpressionType.Constant);
Assert.AreEqual( ((ConstantExpression) right).Value, 2);