gpt4 book ai didi

.net - 究竟什么是 LINQ?

转载 作者:行者123 更新时间:2023-12-04 11:31:14 24 4
gpt4 key购买 nike

这个问题在这里已经有了答案:




11年前关闭。




Possible Duplicate:
Learning about LINQ



大家好,

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

发送

最佳答案

LINQ 有很多东西,它是许多小东西的组合。

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

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

所以而不是:

IEnumerable<int> values = otherValues.Where(i => i > 5);

它们具有以下语法:
IEnumerable<int> values = from i in otherValues
where i > 5
select i;

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

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

所以上面的第一段代码:
IEnumerable<int> values = otherValues.Where(i => i > 5);

实际上最终被编译为:
IEnumerable<int> values = Enumerable.Where(otherValues, i => i > 5);

Where 方法定义为 here: Enumerable.Where .

下一个魔法是 C# 编译器不使用 Enumerable.Where,它所做的是它只是动态重写代码,使其看起来像我在这里的答案中的第二段代码,并让正常的类型推断工作出来。换句话说,它会假装你真的写了第二段代码,然后看到“otherValues”是一个 List<T>。在哪里 Tint ,然后找到 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);

但是,C# 中的表达式支持意味着您也可以将其声明为:
Expression<Func<int, bool>> w = i => i > 5;

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

这种知识允许那些其他 Where 实现,如果它们被声明为采用表达式,则不仅可以获取“where 子句”,而且可以查看它,将其分开并重写它。

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

这是 Where 方法的 LINQ to SQL 声明: Queryably.Where .

因此 LINQ 是添加到 C# 编译器中的许多较小技术的组合:
  • LINQ syntax
  • Extension methods
  • LINQ extension methods (+ 其他实现,特别是查看 LINQ to SQL 。)
  • Lambda expressionsExpression trees .
  • 关于.net - 究竟什么是 LINQ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3343089/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com