6

LINQ 是 .NET 4.0 中的一项新功能,在 .NET 3.5 等旧版本中不受支持吗?它有什么用?它似乎能够构建表达式树。实际上,什么是表达式树?LINQ 是否能够从 C# 文件中提取类、方法和字段等信息?

有人可以为我提供一段工作代码来演示 LINQ 可以做什么吗?

4

5 回答 5

24

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

In 是语言集成查询,尽管它涵盖了对语言和运行时的许多复杂添加,以实现这一点,它们本身很有用。

表达式功能只是让程序在运行时检查传递的某些代码结构的抽象语法的能力。这些被称为 lambdas。并且本质上是一种更容易编写匿名函数的方式,同时更容易对其结构进行运行时自省。

与 Linq 最密切相关的“类似 SQL”的功能(尽管绝不是唯一一个)称为 Linq to Sql,其中类似如下:

from f in Foo where s.Blah == "wibble" select f.Wobble;

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

上面用语言集成的方式写的 lambda 实际上等价于:

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

其中 Foo 是一个类型化的集合。对于数据库,类被合成以表示数据库中的值,以允许编译,并允许从 sql 区域到 .net 区域的往返值,反之亦然。

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

此功能的使用者可能只是选择运行它(执行 lambda 编译为的函数)或询问描述它的表达式,然后用它做一些不同的事情。

尽管并不是真正的 Linq 他们,但使这成为可能的许多方面都放在了“Linq”的旗帜下。
例如,需要匿名类型以便于使用projection(选择可能属性的子集),但匿名类型也可以在 Linq 之外使用。

Linq,特别是通过 lambdas(这使得编写匿名委托在语法方面非常轻量级)导致 c# 的功能能力增加。这通过诸如 Select() 之类的扩展方法得到了加强IEnumerable<T>,对应map于许多函数语言和 Where() 对应于filter. 就像匿名类型一样,它本身并不是“Linq”,尽管许多人认为它对 c# 开发有很大的好处(这不是一个普遍的观点,但被广泛接受)。

表达式是一个更高级的主题,使用linq完全不需要理解它们,尽管使用它们可能会有某些“技巧”。一般来说,只有当您尝试编写 linq 提供程序时才会关心表达式,该提供程序是采用表达式而不是函数的代码,并使用它来执行普通函数以外的其他操作,例如与外部数据源交谈.

其他用途是当您希望获取有关函数内部正在执行的操作的一些元数据时,也许然后编译表达式(产生一个允许您将表达式作为函数执行的委托)并对其执行某些操作或只需查看对象的元数据即可执行反射代码,如此答案所示,该代码已在编译时进行验证。

于 2009-09-15T13:56:50.200 回答
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());
于 2009-09-15T13:58:47.640 回答
1

LINQ 是在 .NET 3.5 中引入的。这个网站有很多例子。

于 2009-09-15T13:47:23.407 回答
1

System.Linq.Expressions 用于手工构建(或机器生成)表达式树。我有一种感觉,考虑到构建更复杂功能的复杂性,这个命名空间正在被使用。然而,它的威力异常强大。例如,我的一位同事最近实现了一个表达式树,它可以使用 cumultive 密度函数自动缩放任何 LINQ to SQL 对象。每列都有自己的树,编译速度如此之快。我一直在构建一个专门的编译器,广泛使用它们来实现基本功能,并将生成的其余代码粘合在一起。

有关更多信息和想法,请参阅此博客文章

于 2009-09-15T15:41:28.840 回答
-2

LINQ是一个 .NET 3.5 功能,具有来自 C# 3.0 和 Visual Basic 2008 的内置语言支持。MSDN上有很多示例

于 2009-09-15T13:46:39.540 回答