表达式树

5

我的理解是:

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

Linq-to-SQL使用表达式树。通常在Linq-to-SQL查询中,编译器将其转换为解析的表达式树。这些树被传递给SQL Server作为T-SQL语句。 SQL服务器执行T-SQL查询并发送结果。这就是为什么当您执行Linq-to-SQL时,会得到IQueryable<T>而不是IEnumerable<T>;因为IQueryable包含。

public IQueryable : IEnumerable
{
   Type Element {get;}
   Expression Expression {get;}
   IQueryableProvider Provider {get;}
}

问题:

  1. 微软在LINQ-to-SQL中使用表达式树。我可以用表达式树的哪些方法来提高我的代码效率?

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

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

5个回答

11

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

你可以通过以下两种方式来处理表达式树:

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

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

如果你正在开发可重用的库 - DI框架、AOP框架、MVC/MVP/MVVM框架、ORM框架等,或者试图扩展其中之一(包括Linq-to-XYZ),那么你很可能会发现表达式树很有用(例如Linq到SQL的批量更新扩展),尽管很难讨论具体示例,因为这完全取决于这种框架的设计。

如果你没有构建这些工具,那表达式树不过是一个好奇心。当然学习它们是很棒的 - 但如果你发现它们没有太多实际用途,也不要太失望。

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

  • NHibernate Linq(当然还有Linq to SQL/EF等)
  • .NET 4 动态语言运行时
  • ...这应该给您一个了解使用表达式树的项目类型的想法。因此,如果您正在构建自己的运行时环境或MVC,肯定希望了解所有相关知识。 ;)


    3
    1. “boost my code”是什么意思?
      表达式树通常不会提高性能,它们用于实现额外的功能。
    2. 表达式树与LINQ无关。例如,依赖注入系统使用它们来有效地指定类型和函数。
    3. LINQ to XML返回IEnumerable<XElement>

    1

    你的链接已经失效了,我想阅读这篇文章。你有没有在其他地方发布过副本? - Scott Baker

    0
    很少有情况可以使用表达式树。
    1)动态规则引擎 - 您可以在运行时构建业务规则逻辑,而不是在代码中硬编码规则逻辑。
    2)动态 Linq 查询 - 开发人员需要编写硬编码查询的各种情况。因此,您可以使用表达式树来消除这种情况。

    -1
    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<int, int> lambda = square.Compile(); - Shobhit Walia
    因为这只是一个缺乏上下文的代码片段,对于所提出的问题没有任何帮助,所以被踩了。 - Scott Baker

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接