2010-03-28 107 views
5

我表达式树的理解是:表达式树

表达式树是在内存中像算术或布尔表达式expression.The表达的表示被存储到分析tree.so我们可以很容易地transalate成其他语言。

Linq to SQL使用表达tree.Normally在LINQ to SQL查询编译器将其转换为解析表达式trees.These被传递到SQL Server,T-SQL Statements.The SQL SERVER执行T-SQL查询,并将结果发送回向下。那就是为什么当你执行LINQ to SQL你得到IQueryable<T>IEnumetrable<T>。因为IQuerybale包含

public IQueryable:IEnumerable 
{ 

    Type Element {get;} 
    Expression Expression {get;} 
    IQueryaleProvider Provider {get;} 
} 

问题:

  1. Microsoft使用表达式树来玩LINQ-to-Sql.What是我可以使用表达式树来增强我的代码的不同方式。除了LINQ to SQL,Linq to amazon,谁在他们的应用程序中使用表达式树?

  2. Linq to Object返回IEnumerable,Linq to SQL返回IQueryable,LINQ to XML返回什么?

回答

10

表达式树提供了一种在实际编译之前检查某段代码的方法,在运行时。

你做就怎么做两件事情的表达式树:

  • 它编译成一个委托,使用Expression.Compile,或
  • 访问树节点,并生成别的东西(即SQL语句) 。

表达式树是很酷,但他们的实际上有一个典型的网站或企业应用程序的任何直接有用的可能性微乎其微。 (a)希望在运行时从C#源生成不同类型的代码,或者(b)想要使用Reflection,但提供一些编译时安全性的措施。如果您正在研究可重用的库 - DI框架,AOP框架,MVC/MVP/MVVM框架,ORM框架等,或试图扩展这些框架之一(包括Linq-to-XYZ),那么尽管很难讨论具体的示例,但您可能会发现表达式树(例如Linq to SQL​​扩展名)的用法,因为它完全取决于此类框架的设计。

如果你不构建这些类型的工具,那么表达式树不仅仅是好奇心。伟大的当然要学习 - 但不要失望,如果你没有找到太多的实际用途。

使用表达式树库的几个例子:

...这应该让你了解那些严重使用表达树的项目。所以,如果你正在构建自己的运行时环境或MVC,那么你一定想学习所有可以学习的东西。 ;)

+0

Thanks.I将按照您的意见。 – user274364 2010-03-28 17:06:02

3
  1. 你说的 '提高我的代码' 是什么意思?表达树不会(通常)提高性能;它们用于启用附加功能。
  2. 表达式树与LINQ无关。例如,它们被依赖注入系统用来有效地指定类型和功能。
  3. LINQ to XML返回IEnumerable<XElement> s。
+0

对不起。要改进我的代码。 – user274364 2010-03-28 16:57:22

0
public static void CreatingExpressionTree() 
{ 
    ParameterExpression parameter1 = Expression.Parameter(typeof(int), "x"); 
    BinaryExpression multiply = Expression.Multiply(parameter1, parameter1); 
    Expression<Func<int, int>> square = Expression.Lambda<Func<int, int>>(
     multiply, parameter1); 
    Func<int, int> lambda = square.Compile(); 
    Console.WriteLine(lambda(5)); 
} 
+0

为什么使用Func lambda = square.Compile(); – 2017-02-26 06:14:00

0

很少有情况下可以使用表达式树。

1)动态规则引擎 - 而不是硬编码代码中的规则逻辑。您可以在运行时构建业务规则逻辑。

2)动态Linq查询 - 开发人员需要编写硬编码查询的情况有很多种。所以你可以使用表达式树来消除这个。