什么是LINQ?

7 .net linq

可能重复:
了解LINQ

嗨,大家好,

我只是想了解DOTNET中究竟是什么LINQ?它是如何工作的?

TX

ang*_*son 4

LINQ 包含很多东西,它是许多较小的东西的组合。

这个答案将是一堆信息,我很抱歉。你最好的选择是稍等一下,看看其他人是否总结得更好,然后用谷歌搜索我使用的关键字。

LINQ代表“ Language IN tegerated Query ”,最天真的解释是他们在 C# 编程语言中添加了类似 SQL 的语法。

所以而不是:

IEnumerable<int> values = otherValues.Where(i => i > 5);
Run Code Online (Sandbox Code Playgroud)

它们的语法如下:

IEnumerable<int> values = from i in otherValues
                          where i > 5
                          select i;
Run Code Online (Sandbox Code Playgroud)

C# 编译器实际上会将上面的第二段代码转换为第一段代码,因此实际上,您只是在集合上调用方法。

然而,这是难题的另一部分。这些方法实际上根本没有在集合中定义。它们被定义为扩展方法,这意味着它们在其他地方定义,有一些技巧,基本上是“让程序员使用这些方法,就像它们是在集合类型中定义的一样,然后在编译期间修复代码”。

所以上面的第一段代码:

IEnumerable<int> values = otherValues.Where(i => i > 5);
Run Code Online (Sandbox Code Playgroud)

实际上最终被编译为:

IEnumerable<int> values = Enumerable.Where(otherValues, i => i > 5);
Run Code Online (Sandbox Code Playgroud)

Where 方法在这里定义:Enumerable.Where

下一个神奇之处是 C# 编译器不使用 Enumerable。它所做的是,它只是动态重写代码,使其看起来像我的答案中的第二段代码,并让正常类型推断工作出来。换句话说,它会假装您实际上编写了第二段代码,然后看到“otherValues”是 aList<T>其中T是 an int,然后找到Enumerable.Where要调用的代码。

这意味着,对于集合以外的其他类型,您实际上可以创建自己的Where 实现,并且LINQ 语法不会更明智。

这意味着......可以查询实际上不是内存中集合的东西。例如,如果上面的“otherValues”知道如何从数据库获取数据,则将调用不同的Where 方法,而不是Enumerable.Where 中的方法。

这允许其他实现以自己的方式完成任务,例如为您编写 SQL、执行它并打包结果,以便调用代码看起来就像它实际上是一个内存中集合一样首先。

下一个魔法是表达式。在大多数情况下,上面Where方法的参数i => i > 5是一个lambda表达式,或者是一个匿名方法,对于内存中的集合,您实际上可以这样声明它:

Func<int, bool> w = delegate(int i) { return i > 5; };
IEnumerable<int> values = otherValues.Where(w);
Run Code Online (Sandbox Code Playgroud)

但是,C# 中的表达式支持意味着您也可以将其声明为:

Expression<Func<int, bool>> w = i => i > 5;
Run Code Online (Sandbox Code Playgroud)

在这里,编译器实际上并不是将其存储为一段已编译的代码,而是一种内存中的数据结构,它知道它需要一个参数,通过大于比较将其与 5 进行比较并返回结果。请注意,您必须使用 lambda 方式编写它,而不是作为委托。

这些知识允许其他Where 实现(如果它们被声明为采用表达式)不仅可以掌握“where 子句”,还可以查看它、将其拆开并重写它。

这意味着生成 SQL 可以在知道如何处理 SQL 代码的Where 方法中完成。

以下是Where 方法的LINQ to SQL 声明:Queryively.Where

因此,LINQ 是添加到 C# 编译器中的许多较小技术的组合: