表达树

时间:2010-03-28 16:40:58

标签: c# asp.net expression-trees

我对表达式树的理解是:

表达式树是表达式的内存表示,如算术或布尔表达式。表达式存储在已解析的树中。因此我们可以轻松地转换为任何其他语言。

Linq to SQL使用表达式树。通常在LINQ to SQL查询中,编译器将其转换为已解析的表达式树。这些树作为T-SQL语句传递给Sql Server.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使用Expression树来玩LINQ-to-Sql。我可以使用表达式树来提升代码的不同方法。

  2. 除了LINQ to SQL,Linq到亚马逊,谁在他们的应用程序中使用了表达式树?

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

5 个答案:

答案 0 :(得分:11)

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

您可以使用表达式树完成两件事:

  • 使用Expression.Compile
  • 将其编译为代理
  • 访问树节点并从中生成其他内容(即SQL语句)。

表达式树很酷,但它们实际上对典型网站或企业应用程序具有任何直接有用性的可能性很小。只有在(a)想要在运行时从C#源生成不同类型的代码时,或者(b)想要使用Reflection但提供一些编译时安全性时,才会使用它们。

如果您正在研究可重用的库 - DI框架,AOP框架,MVC / MVP / MVVM框架,ORM框架等,或尝试扩展其中一个框架(包括Linq-to-XYZ),那么您可能会找到表达式树的用途(例如Linq to SQL batch update扩展名),虽然很难讨论特定的示例,因为它完全取决于这种框架的设计。

如果你没有构建这些工具,那么表达树只不过是一种好奇心。很高兴当然要了解 - 但如果你没有找到太多实际用途,请不要失望。

使用表达式树的库的一些示例:

......这应该可以让您了解严重使用表达式树的项目类型。因此,如果您正在构建自己的运行时环境或MVC,那么您肯定希望了解所有可能的内容。 ;)

答案 1 :(得分:3)

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

答案 2 :(得分:1)

我建议在这里阅读一些文章:http://blogs.msdn.com/csharpfaq/archive/tags/expression+trees/default.aspx

我写这些来回答像这样的问题。我试图给出基础知识,并展示一些有趣的技巧,你可以使用LINQ和DLR之外的表达式树。

答案 3 :(得分: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));
}

答案 4 :(得分:0)

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

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

2)动态Linq查询 - 开发人员需要编写硬编码查询的各种场景。所以你可以使用表达式树来消除它。