什么是LINQ?

时间:2010-07-27 11:26:49

标签: .net linq

  

可能重复:
  Learning about LINQ

大家好,

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

的Tx

5 个答案:

答案 0 :(得分:4)

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

这个答案将是一个混乱的信息,我道歉。你最好的办法是等一下,看看别人是否更好地总结了它,然后谷歌搜索我使用的关键词。

LINQ 代表“ L anguage IN tegrated Q uery”,最天真的解释是他们为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,然后找到{ {1}}是要打电话的人。

这意味着,对于除集合之外的其他类型,您实际上可以自己实现Where,而LINQ语法将更加明智。

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

这允许其他实现以他们自己的方式完成他们的事情,例如通过为您编写SQL,执行它,并打包结果,使它看起来像调用代码,就像它实际上是在 - 记忆集合开始。

下一段魔术就是表情。在大多数情况下,上面Where方法的参数Enumerable.Where是一个lambda表达式或匿名方法,你实际上可以为内存中的集合声明它:

i => i > 5

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

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

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

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

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

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

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

答案 1 :(得分:3)

MSDN在介绍LINQ方面做得非常好:

  

[...]

     

.NET语言集成查询定义   一套通用标准   查询允许遍历的运算符,   过滤和投影操作   直接表达   任何基于.NET的声明方式   编程语言。标准   查询运算符允许查询   适用于任何基于IEnumerable的   信息来源。 LINQ允许第三个   各方增加标准   使用new查询运算符   特定于域的运营商   适用于目标域或   技术。更重要的是,第三   各方也可以自由更换   标准查询运算符与他们的   自己提供的实现   其他服务,如远程   评估,查询翻译,   优化等。通过坚持   LINQ的约定   模式,这样的实现享受   相同的语言集成和工具   支持作为标准查询   运算符。

     

[...]

http://msdn.microsoft.com/library/bb308959.aspx

答案 2 :(得分:2)

这是几件不同的事情。

Linq,因为它出现在System.Linq命名空间中,是一组扩展方法,允许您直接在代码中查询集合。它是“语言整合查询”的首字母缩写。

它也是一组提供程序,允许您查询不同的数据源 - 使用Linq to SQL的SQL,使用Linq to XML的XML等等。

答案 3 :(得分:0)

将其视为使用类似SQL的语法查询对象。 以下是从http://msdn.microsoft.com/en-us/vcsharp/aa336746.aspx

复制的示例
public void Linq1()
{
    int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };

    var lowNums =
        from n in numbers
        where n < 5
        select n;

    Console.WriteLine("Numbers < 5:");
    foreach (var x in lowNums)
    {
        Console.WriteLine(x);
    }
}

答案 4 :(得分:0)

Linq是IEnumerable的一组扩展方法。它旨在让您抽象出从集合中获取对象的一些细节。当您通过Linq“查询”您的收藏集时,您可以通过声明性而非命令式的方式进行查询。这意味着您的Linq查询显示了您想要获得的内容,而不是您将如何获得它。在foreach()循环中,您必须非常清楚地了解如何对结果进行过滤,分组和排序。使用Linq,它只是一些简短的陈述,而实现细节则从您身上抽象出来。

很多人误以为它与SQL有关,因为Linq-to-Sql,但实际上这只是Linq的一小部分。您不必使用L2S来充分利用Linq的功能,事实上很多人都没有。虽然我个人认为Linq-to-SQL是猫的喵喵,如果你是一个只有SQL Server作为你的数据库的.NET商店。