什么是 LINQ? 它做什么?

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

93543 次浏览

Http://msdn.microsoft.com/en-us/netframework/aa904594.aspx

”LINQ 项目是对。NET Framework,它包含语言集成的查询、集合和转换操作。它使用查询的本地语言语法扩展了 C # 和 Visual Basic,并提供了类库来利用这些功能。”

LINQ (语言集成查询)可参考:

  • 用于集合和迭代器操作的库,它广泛使用高阶函数作为参数(System.Linq)

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

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

  • 一种接口定义,数据提供者为了接收查询结构并可能对其进行优化,可能会遵循这种接口定义,偶尔也会遵循兼容的数据提供者本身

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

简而言之,LINQ (语言集成查询)允许您直接在代码中编写查询。这些查询可以针对关系数据库,也可以针对 XML 或内存中的容器对象,如数组和列表。更多信息可以在 MSDN 库中获得: http://msdn.microsoft.com/en-us/library/bb308959.aspx

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

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

在最基本的层次上,它包含一组 IEnumable < T >-eg. 、 Select、 Sum、 Where-的方法,这些方法可用于限制、投影等[1]

更进一步,LINQ 还定义了一个新的 LINQ 提供者模型,它可以获取一个表达式树,并使用它对 CLR 之外的数据源运行“本机”查询——例如,LINQ To SQL,LINQ To XML,LINQ To NHibernate 等。

C # 和 VB.NET 还定义了一种查询语法,允许在内联中编写强类型查询(看起来非常类似于 SQL) ,然后编译器将其转换为等效的 IEnumable < T > 调用。

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

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

LINQ 代表 语言集成查询

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

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

  • LINQToObjects-检查 系统。 Linq。可枚举查询方法。这些目标 IEnumerable<T>允许以类型安全的方式查询任何类型化的可循环集合。这些查询依赖于已编译的。NET 方法,而不是表达式。

  • 检查 系统。林克。可查询中的一些查询方法。这些目标为 IQueryable<T>,允许构造可由底层实现翻译的表达式树。

  • 表达式树——检查 表达式命名空间。这是数据代码。在实践中,您应该了解这些内容,但是实际上并不需要针对这些类型编写代码。语言特性(比如 lambda 表达式)允许您使用各种简写来避免直接处理这些类型。

  • LINQToSQL ——检查 系统,数据,Linq命名空间。特别是 DataContext。这是由 C # 团队构建的 DataAccess 技术。就是这样。

  • LINQTo 实体-检查 系统、数据、对象名称空间。特别是 ObjectContext。这是由 ADO.NET 团队构建的 DataAccess 技术。它比 LINQToSQL 更复杂、功能更强大,也更难使用。

  • LINQToXML-检查 System.Xml.Linq名称空间。本质上,人们对 System.Xml的内容并不满意。因此,微软重新编写了它,并利用重新编写的机会引入了一些方法,使得针对 XML 使用 LINQToObjects 变得更加容易。

  • 一些不错的助手类型,如 有趣开拍。这些类型是具有泛型支持的委托。声明自己的自定义(和不可交换)委托类型的日子已经一去不复返了。

以上所有内容都是。NET 框架,并可从任何。NET 语言(VB.NET,C # ,IronPython,COBOL。NET 等)。


好了,说说语言特征。我还是用 C # 吧,因为这是我最擅长的。NET 也有几个类似的改进(还有一些 C # 没有得到的—— XML 文本)。这是一个简短而不完整的列表。

  • 扩展方法-这允许你“添加”一个方法来类型。该方法实际上是一个静态方法,它被传递一个类型的实例,并且被限制在该类型的公共契约中,但是它对于向您不控制的类型(字符串)添加方法或向接口添加(完全实现的)助手方法非常有用。

  • 查询理解语法-这允许你写在一个 SQL 样的结构。所有这些东西都被转换成 System 上的方法。Linq.可查询或系统。Linq.枚举数(取决于 myCustomer 的类型)。它是完全可选的,您可以在没有它的情况下很好地使用 LINQ。这种查询声明样式的一个优点是范围变量的作用域: 它们不需要为每个子句重新声明。

    IEnumerable<string> result =
    from c in myCustomers
    where c.Name.StartsWith("B")
    select c.Name;
    
  • Lambda Expressions - This is a shorthand for specifying a method. The C# compiler will translate each into either an anonymous method or a true System.Linq.Expressions.Expression. You really need to understand these to use Linq well. There are three parts: a parameter list, an arrow, and a method body.

    IEnumerable<string> result = myCustomers
    .Where(c => c.Name.StartsWith("B"))
    .Select(c => c.Name);`
    
  • Anonymous Types - Sometimes the compiler has enough information to create a type for you. These types aren't truly anonymous: the compiler names them when it makes them. But those names are made at compile time, which is too late for a developer to use that name at design time.

    myCustomers.Select(c => new
    {
    Name = c.Name;
    Age = c.Age;
    })
    
  • Implicit Types - Sometimes the compiler has enough information from an initialization that it can figure out the type for you. You can instruct the compiler to do so by using the var keyword. Implicit typing is required to declare variables for Anonymous Types, since programmers may not use the name of an anonymous type.

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

LINQ 是一种使用源自 C # 编程语言的习惯用法提取数据的技术。虽然它在函数设计上很大程度上归功于 SQL,但从根本上说,它是自己的数据查询语言。它跨多种数据源(SQL 数据库、内存表示、 XML 等)进行操作。特别是 LINQ-To-SQL,应该被看作是与传统的嵌入式 SQL 的使用形成对比,传统的嵌入式 SQL 遭受着 SQL 编程和 C #/VB 编程之间的“阻抗不匹配”的困扰。

为了讨论 LINQ 及其局限性,您可能想看一看这个相关的问题: LINQtoSQL 不是没有抓住重点吗?