LINQ是什么,它有什么作用?[关闭]


126

什么是LINQ?我知道它是用于数据库的,但是它有什么作用?


20
我相信我已经击败了“无法合理回答”的标准。没有理由应该解决这个问题。
Amy B

1
听LINQ的创建者Erik Meijer讲讲它是什么。顺便说一句,它不是仅用于数据库。
Sнаđошƒаӽ

Answers:


171

LINQ代表语言集成查询

Microsoft语言开发人员没有编写YAQL(又一种查询语言),而是提供了一种直接用其语言(例如C#和Visual Basic)表示查询的方法。构成这些查询的技术不依赖于要查询的事物的实现细节,因此您可以针对许多目标(数据库,内存中的对象,XML)编写有效的查询,而实际上无需考虑底层方法。查询将被执行。

让我们从属于.NET Framework(3.5)的部分开始探索。

  • LINQ To Objects-检查System.Linq.Enumerable的查询方法。这些target IEnumerable<T>,允许以类型安全的方式查询任何类型的loopable集合。这些查询依赖于已编译的.NET方法,而不是表达式。

  • LINQ To Anything-检查System.Linq.Queryable的某些查询方法。这些目标IQueryable<T>,允许构建可被基础实现转换的表达式树。

  • 表达式树-检查System.Linq.Expressions命名空间。这是代码作为数据。在实践中,您应该意识到这一点,但实际上并不需要针对这些类型编写代码。语言功能(例如lambda表达式)可让您使用各种简写形式来避免直接处理这些类型。

  • LINQ To SQL-检查System.Data.Linq命名空间。特别注意DataContext。这是C#团队构建的DataAccess技术。它只是工作。

  • LINQ To Entities-检查System.Data.Objects命名空间。特别注意ObjectContext。这是ADO.NET团队构建的DataAccess技术。它比LINQ To SQL更复杂,功能强大且更难使用。

  • LINQ To XML-检查System.Xml.Linq命名空间。本质上,人们对中的内容不满意System.Xml。因此,Microsoft重新编写了该文件,并利用重新编写的代码引入了一些方法,这些方法使对XML使用LINQ To Objects更加容易。

  • 一些不错的帮助程序类型,例如FuncAction。这些类型是具有通用支持的委托。声明您自己的自定义(和不可互换的)委托类型的日子已经一去不复返了。

以上所有内容都是.NET Framework的一部分,可从任何.NET语言(VB.NET,C#,IronPython,COBOL .NET等)获得。


好的,继续讲语言功能。我将坚持使用C#,因为这是我最了解的。VB.NET也有一些类似的改进(还有C#没有得到的-XML文字)。这是一个简短且不完整的清单。

  • 扩展方法-这使您可以“添加”要键入的方法。该方法实际上是传递给该类型的实例的静态方法,并且仅限于该类型的公共协定,但是对于将方法添加到不受控制的类型(字符串)或添加(完全实现)非常有用)接口的辅助方法。

  • 查询理解语法-这使您可以使用SQL Like结构进行编写。所有这些东西都转换为System.Linq.Queryable或System.Linq.Enumerable上的方法(取决于myCustomers的类型)。它是完全可选的,没有它您也可以很好地使用LINQ。这种查询声明样式的优点之一是范围变量是有作用域的:不需要为每个子句重新声明它们。

    IEnumerable<string> result =
     from c in myCustomers
     where c.Name.StartsWith("B")
     select c.Name;
  • Lambda表达式-这是指定方法的简写。C#编译器会将每个转换为匿名方法或true System.Linq.Expressions.Expression。您真的需要了解这些内容,才能很好地使用Linq。它由三部分组成:参数列表,箭头和方法主体。

    IEnumerable<string> result = myCustomers
     .Where(c => c.Name.StartsWith("B"))
     .Select(c => c.Name);`
  • 匿名类型-有时编译器具有足够的信息来为您创建类型。这些类型不是真正的匿名:编译器在创建它们时将其命名。但是这些名称是在编译时创建的,对于开发人员在设计时使用该名称为时已晚。

    myCustomers.Select(c => new 
    {
      Name = c.Name;
      Age = c.Age;
    })
  • 隐式类型-有时编译器从初始化中获得了足够的信息,可以为您找出类型。您可以使用var关键字指示编译器执行此操作。由于程序员可能不会使用匿名类型的名称,因此需要隐式类型来声明匿名类型的变量。

    // The compiler will determine that names is an IEnumerable<string>
    var names = myCustomers.Select(c => c.Name);

14

LINQ(语言集成查询)可以引用:

  • 一个用于集合和迭代器操作的库,该库大量使用高阶函数作为参数(System.Linq)

  • 一个用于将简单函数作为抽象语法树进行传递和操纵的库(System.Linq.Expressions)

  • 对各种语言的语法扩展,以提供更类似于SQL的语法来处理集合,为匿名函数提供更紧凑的表示法,以及引入在语法上与最终成员函数无法区分开的静态辅助函数的机制

  • 数据提供者可能会遵循的接口定义,以便接收查询结构并可能在其上执行优化,或者有时兼容的数据提供者本身

这些组件可以单独使用或组合使用。



6

我将尝试一个简单的答案:LINQ是一种使用类似于SQL的查询语言来查询数据库(或其他数据存储,XML等)的方法,但可以在.NET应用程序中进行编译。


1
那么Linq和SQL之间到底有什么区别?
Kredns

我认为有一个更复杂的名称,但结构不同:SQL是从何处选择,而LINQ是从何处选择。LINQ更易于使用。LINQ更容易:),考虑到节省的时间,它产生的SQL通常足够好。
jcollum

2
说实话,人们可以说SQL 为被写入From Where Select, etc.-即它的方式要写入结果集实际上形成
唐·钱德尔

6

LINQ代表语言集成查询,是在CLR中提供通用“查询”机制的一种方式。

在最基本的级别上,它由IEnumerable <T>上的一组方法(例如Select,Sum,Where)组成,可用于限制,预测等。[1]

进一步讲,LINQ还定义了一个新的LINQ提供程序模型,该模型可以采用一个表达式树,并使用它对CLR外部的数据源运行“本机”查询-例如,LINQ to SQL,LINQ to XML,LINQ NHibernate等

C#和VB.NET还定义了一种查询语法,该语法使您可以内联编写强类型查询(看起来与SQL非常相似),然后编译器将其转换为等效的IEnumerable <T>调用。

对我来说,关于LINQ的最有趣的事情是支持它所需的所有C#和VB.NET功能本身就很有用。支持LINQ都需要扩展方法,匿名类型,lambda表达式和隐式类型-但是我们倾向于在纯LINQ上下文之外使用这些功能。

[1]这些是关系术语,函数式程序员可能更喜欢Map,Reduce,Fold等。


5

LINQ是一种使用从C#编程语言派生的惯用法提取数据的技术。尽管它在功能设计上应归功于SQL,但从根本上说,它是它自己的数据查询语言。它可在各种数据源(SQL数据库,内存中表示形式,XML等)中运行。特别是LINQ-To-SQL,应被视为与传统嵌入式SQL的使用形成对比,传统使用嵌入式SQL的原因是SQL编程和C#/ VB编程之间通常被称为“阻抗不匹配”。

关于LINQ及其局限性的讨论,您可能需要看一下以下相关问题:LINQ to SQL会不会遗漏要点?


0

http://msdn.microsoft.com/zh-CN/netframework/aa904594.aspx

“ LINQ项目是.NET Framework扩展集的代号,该扩展集包含语言集成的查询,设置和转换操作。它使用本机语言语法扩展C#和Visual Basic,并提供类库以利用这些功能。”


对数据库来说呢?对于我在这里(在SO中)看到的内容,它更像是.net环境中的集合。
OscarRyz
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.