【问题标题】:Expression Tree表达式树
【发布时间】:2010-03-28 16:40:58
【问题描述】:

我对表达式树的理解是:

表达式树是算术或布尔表达式等表达式的内存表示。表达式存储在解析树中。因此我们可以轻松翻译成任何其他语言。

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

  2. 除了 LINQ to SQL、Linq to amazon,还有谁在他们的应用程序中使用了表达式树?

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

【问题讨论】:

    标签: c# asp.net expression-trees


    【解决方案1】:

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

    你可以用表达式树做两件事:

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

    表达式树很酷,但对于典型的网站或企业应用程序,它们真正直接有用的可能性很小。只有当您 (a) 想要在运行时从 C# 源代码生成不同类型的代码,或者 (b) 想要使用反射但提供某种编译时安全措施时,您才会使用它们。

    如果您正在开发可重用的库 - DI 框架、AOP 框架、MVC/MVP/MVVM 框架、ORM 框架等,或者尝试扩展这些框架之一(包括 Linq-to-XYZ),那么您可能会发现表达式树的用途(例如 Linq to SQL batch update 扩展),尽管很难讨论具体的示例,因为它完全取决于这样一个框架的设计。

    如果您不构建此类工具,那么表达式树只不过是一种好奇心。当然很高兴了解它们 - 但如果您没有发现它们的太多实际用途,请不要失望。

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

    ...这应该让您了解那些认真使用表达式树的项目。因此,如果您正在构建自己的运行时环境或 MVC,您肯定想学习所有可以学习的东西。 ;)

    【讨论】:

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

      【讨论】:

        【解决方案3】:

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

        我写它们是为了回答这样的问题。我尝试提供基础知识并展示一些有趣的技巧,您可以使用 LINQ 和 DLR 之外的表达式树进行操作。

        【讨论】:

          【解决方案4】:
          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));
          }
          

          【讨论】:

          • 你为什么使用 Func lambda = square.Compile();
          【解决方案5】:

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

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-04-09
            • 2010-12-28
            相关资源
            最近更新 更多