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

有人可以给我提供一段工作代码来演示 LINQ 的功能吗?

有帮助吗?

解决方案

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

其他提示

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

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

表达式功能简单地说就是程序在运行时检查传递的某些代码结构的抽象语法的能力。这些称为 lambda。从本质上讲,它们是一种更轻松地编写匿名函数的方法,同时使运行时对其结构的自省变得更容易。

与 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 到对象”),则可以应用完全相同的代码,然后表达式的转换将直接转换为 .Net 代码。

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

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

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

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

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

尽管它们本身并不是真正的 Linq,但实现这一点的许多方面都被置于“Linq”旗帜下。
例如,需要匿名类型才能轻松使用 projection (选择可能属性的子集)但匿名类型也可以在 Linq 之外使用。

Linq,特别是通过 lambda(这使得编写匿名委托在语法方面非常轻量级),导致了 c# 功能的增强。这通过扩展方法得到加强 IEnumerable<T> 类似Select(),对应 map 在许多函数语言中,Where() 对应于 filter. 。与匿名类型一样,这本身并不是“Linq”,尽管许多人认为它对 C# 开发有很大的有益影响(这不是普遍观点,但得到了广泛持有)。

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

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

这个问题的一个尚未涉及的领域是表达树。关于表达式树(和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());

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

此处有关的内容也非常广泛。

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

请参阅此博客文章了解更多信息和想法。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top