【发布时间】:2010-07-28 20:33:42
【问题描述】:
好吧,我就是不明白。
我已经尽可能多地阅读了有关该主题的内容,但不知道它的全部内容:
- 为什么要使用表达式树?
- 什么是我何时以及如何使用它们的真实示例?
- 使用它们有哪些总体好处?
【问题讨论】:
标签: .net linq lambda expression-trees
好吧,我就是不明白。
我已经尽可能多地阅读了有关该主题的内容,但不知道它的全部内容:
【问题讨论】:
标签: .net linq lambda expression-trees
表达式树 API 最初是为了创建自定义 LINQ 提供程序而编写的。基本上,如果您使用 LINQ to Objects,您不会处理表达式树。但是,如果您使用 LINQ to SQL,那么 LINQ 提供程序可以使用表达式树。
在 .Net 4.0 中,表达式树 API 得到了扩展,并被 DLR 大量使用。因此,如果您打算向 .NET 添加新的动态语言,您将需要它。
正如经常发生的那样,人们找到了更多使用表达式树的方法。有时您可以使用 ET 来获取有关对象的更多信息,而不是反射。在 .NET 4 中,您还可以使用它们来生成动态方法。但请记住,这些更像是高级技巧,而不是推荐的场景。
以下是一些您可以查看的链接:
Getting Information About Objects, Types, and Members with Expression Trees
Generating Dynamic Methods with Expression Trees in Visual Studio 2010
【讨论】:
表达式树本质上是一段经过解析的代码,作为数据处理给您。然后,您的程序可以在运行时随心所欲地解释该数据。这使您可以根据业务逻辑解释代码。
假设您需要定义业务规则。您可以基于 C# 为它们定义语法,然后直接在源代码中编写新规则。通过将它作为表达式树接受到您的引擎中,解析、语法检查和类型检查的繁琐工作已经为您完成。您只需遍历树并应用规则即可。
【讨论】:
它们确实非常有用。
每个 lambda 表达式都可以成为方法或表达式树。
方法显然是在框架中本地执行的。
表达式树可以转换为其他表示。例如 LINQ for SQL 将查询表达式转换为 SQL 语法并在服务器上远程执行。
【讨论】:
当你写这样的东西时:
var q = from d in Data.Table
where d.Name == "SomeName"
select d
它变成了一个表达式树。当您对 SQL 使用此 linq 查询时,底层 Linq-to-SQL 使用此树来进行高性能 SQL 查询。
所以它在你做 linq 的事情时被使用在“幕后”。
您可以构建自己的表达式树。如果您想进行动态查询,这可能非常有用。这可能是不同类型的搜索条件。您甚至可以使用它与 where 子句和其他很酷的东西进行多个内部连接,即使您事先不知道您正在使用的类型。不过,这需要一些反思。
【讨论】:
假设您正在为 LINQ 编写查询提供程序(例如,将 LINQ 查询转换为 SQL 的 SQL Server 提供程序)——也许您是数据库供应商,并且您希望实现对数据库引擎的支持。您将使用表达式树来构建您的 sql。
【讨论】:
它们非常有用。 除了 linq to sql 之外,它们还用于在 mvc 2.0 中创建 strongly typed html helpers 或提供使用 GPU 进行数学计算的方法,即 Brahma project。
基本上,表达式树提供了解释编译表达式而不是执行它的能力。所以它们是在 C# 中创建一种 DSL 的手段。
【讨论】: