什么是C#中的System.Linq.Expressions用于?

yee*_*een 5 c# linq abstract-syntax-tree visual-studio

LINQ是.NET 4.0的新功能吗?像.NET 3.5这样的旧版本没有?

我很想知道这一点,因为它似乎与我正在进行的项目有某种关系.

什么是LINQ有用的?它似乎能够构建表达式树.什么是实际的表达式树?LINQ能够从C#文件中提取类,方法n字段等信息吗?

有人能为我提供一段代码来证明LINQ可以做什么吗?

谢谢!

Shu*_*oUk 22

Linq被添加到.Net 3.5中(并添加到c#3.0编译器以及稍微限制的形式到同一版本中的VB.net编译器)

在语言集成查询中,虽然它涵盖了语言和运行时的许多复杂的添加,以便实现这对它们本身有用.

Expression函数简单地赋予程序在运行时检查传递的某些代码结构的抽象语法的能力.这些被称为lambdas.而且,本质上是一种更容易编写匿名函数的方法,同时使运行时对其结构的内省更容易.

Linq与Linq最密切相关的"SQL like"功能称为Linq to Sql,其中包括:

from f in Foo where s.Blah == "wibble" select f.Wobble;
Run Code Online (Sandbox Code Playgroud)

被编译成该查询的表示,而不是简单地执行查询的代码.使它成为linq to sql的部分是将其转换为sql的"后端".为此,表达式被转换为sql server语句,以执行针对链接数据库的查询,从行到.net对象的映射以及将c#逻辑转换为等效的where子句.如果Foo是普通.net对象的集合(此时它是"Linq to objects"),则可以应用完全相同的代码,表达式的转换将是直接的.Net代码.

上面用语言集成方式编写的lambda实际上相当于:

Foo.Where(f => f.Blah =="wibble).选择(f => f.Wobble);

Foo是一个打字的集合.对于数据库,合成类以表示数据库中的值,以允许它进行编译,并允许从sql区域到.net区域的往返值,反之亦然.

Linq 语言集成部分的关键方面是结果语言结构是结果代码的第一类部分.它们不是简单地产生函数,而是提供构造函数的方式(作为表达式),以便程序的其他方面可以操纵它.

具有此功能的消费者可能只是选择运行它(执行lambda编译为的函数)或者请求描述它的表达式,然后执行与之不同的操作.

尽管不是真正的Linq themsleves,但是使这成为可能的许多方面被置于"Linq"旗帜下.
例如,匿名类型是易于使用projection(选择可能属性的子集)所必需的,但匿名类型也可以在Linq之外使用.

Linq,特别是通过lambdas(使得编写匿名委托在语法方面非常轻量级)导致c#的功能增强.这是通过IEnumerable<T>类似Select()的扩展方法加强的,对应map于许多函数语言和Where()对应的filter.就像匿名类型一样,这本身并不是"Linq",虽然被许多人认为是对c#开发的一种强烈有益的影响(这不是普遍的观点,但是被广泛认可).

  • 有关从Microsoft获取Linq的介绍,请阅读本文
  • 有关如何在Visual Studio中使用Linq-to-Sql的介绍,请参阅Scott Guthrie的这个系列
  • 有关如何在使用集合时使用linq使普通c#更容易的指南,请阅读本文

表达式是一个更高级的主题,使用 linq 对它们的理解是完全不必要的,尽管使用它们可能会有某些"技巧".一般情况下,只有在尝试编写linq提供程序时才会关心表达式,这些提供程序是一个代码来获取表达式而不仅仅是一个函数,并使用它来执行除普通函数之外的操作,例如与外部数据源进行对话.

其他用途是当你希望获得一些关于函数内部函数的元数据时,可能然后编译表达式(产生一个委托,它将允许你将表达式作为一个函数执行)并用它做一些事情或者只是查看对象的元数据来做反射代码,这是编译时验证的,如此答案所示.


Ty.*_*Ty. 5

表达式树是该问题尚未涉及的一个领域。有对表达式树(和lambda表达式)提供一个很好的文章在这里

带来了约表达式树的另一个重要的事情是,通过建立一个表达式树来定义你什么要做的事情,你没有真正做任何事情。我指的是推迟执行。

//this code will only build the expression tree
var itemsInStock = from item in warehouse.Items
                   where item.Quantity > 0;

// this code will cause the actual execution
Console.WriteLine("Items in stock: {0}", itemsInStock.Count());
Run Code Online (Sandbox Code Playgroud)


Jef*_*tes -2

LINQ是 .NET 3.5 的一项功能,具有 C# 3.0 和 Visual Basic 2008 的内置语言支持。MSDN 上有大量示例