2

http://geekswithblogs.net/Martinez/archive/2009/06/29/understanding-expression-trees.aspx

通过阅读这篇解释什么是表达式树以及它们的用途的文章,我有一些问题,那就是那些没有清楚地回答我的文章。

A.数据结构和“已编译的代码”有什么区别。* 我知道数据结构是 Array,List,.. 但这不是我要找的答案。

B.为什么在 Entity Framework 中使用数据结构比使用“编译代码”在效率方面更好。

4

2 回答 2

3

回答 A 和 B。

编译后的代码不能被逆向工程成可以转换为 SQL 的东西。有很多细节使您想要转换为 SQL 的原始概念消失了。表达式树可以在运行时进行分析和理解,而编译的代码则不能。

可以使用查询的另一种元表示,但表达式树的优势在于编译器中的现有管道可用于大量繁重的工作。

于 2012-10-23T18:15:23.207 回答
1

AnExpression是代表代码的代码。在调用Compile().

AnExpression包含一个描述一些代码的对象图。所以示例函数:

x => x + 1

表示一个接受 1 个参数并返回表达式 (x + 1) 的函数。作为一个对象图,它是这样的:

Expression
   AdditionExpression
       RightValue
          VariableExpression (x)
       LeftValue
          LiteralExpression (1)

您可以解析表达式并找出表达式各部分的名称,或者文字值是什么,或者操作是什么。一旦编译完成,它就是一个逻辑操作序列,所有元数据都会丢失。

就实体框架而言,给定一个示例表达式,如下所示:

myObjects.Where(x => x.Id > 10).ToList()

LINQ to SQLIQueryable提供程序正在检查此表达式,查找属性名称,Id然后查找文字值 10 以将其转换为 SQL 语句。如果这是一个函数(一个已编译的代码单元),则没有要检查的元数据,并且不可能转换为 SQL。它还允许您将事物解构为支持和不支持的表达式,以确保您的 SQL 查询仅返回请求的数据,而不是大型数据集。

于 2012-10-23T18:18:45.767 回答