http://geekswithblogs.net/Martinez/archive/2009/06/29/understanding-expression-trees.aspx
通过阅读这篇文章来说明什么是表达式树以及它们的用途我有一些问题,那些文章没有回答我。
A。数据结构和“编译的代码段”之间有什么区别。 *我知道数据结构是Array,List,..但这不是我要找的答案。
B. 为什么在效率方面使用实体框架中的数据结构比“编译的代码片段”更好。
答案 0 :(得分:3)
回答A和B.
编译后的代码片段不能反向设计成可以转换为SQL的东西。有许多细节使您想要转换为SQL的原始概念消失。当编译的代码不能时,可以在运行时分析和理解表达式树。
可以使用查询的另一个元表示,但表达式树的优点是编译器中的现有管道可用于许多繁重的工作。
答案 1 :(得分:1)
Expression
是代表代码的代码。在您致电Compile()
之前,它不是可执行的代码段。
Expression
包含描述某些代码的对象图。所以示例函数:
x => x + 1
表示一个带有1个参数的函数,并返回表达式(x + 1)。作为对象图,它是这样的:
Expression
AdditionExpression
RightValue
VariableExpression (x)
LeftValue
LiteralExpression (1)
您可以解析表达式并找出表达式各部分的名称,或者字面值是什么,或者操作是什么。一旦编译完成,它就是一个逻辑操作序列,所有这些元数据都会丢失。
就实体框架而言,给出如下样本表达式:
myObjects.Where(x => x.Id > 10).ToList()
LINQ to SQL IQueryable
提供程序正在检查此表达式,查找属性Id
的名称,然后查找字面值10以将其转换为SQL语句。如果这是一个函数(编译的代码单元),则没有要检查的元数据,并且无法转换为SQL。它还允许您将事物解构为受支持和不受支持的表达式,以确保您的SQL查询仅返回所请求的数据,而不是大型数据集。