LINQ是什么?我知道它与数据库有关,但它具体做什么呢?
LINQ代表“语言集成查询”。
微软的语言开发人员提供了一种直接在它们的语言中(如C#和Visual Basic)表达查询的方式,而不是编写一个新的查询语言。形成这些查询的技术不依赖于被查询的实现细节,因此您可以针对许多目标(数据库、内存对象、XML等)编写有效的查询,几乎不考虑查询将以何种方式执行的底层方式。
让我们从属于.NET Framework(3.5)的组件开始探索。
LINQ To Objects - 检查System.Linq.Enumerable的查询方法。这些方法针对IEnumerable<T>
,允许以类型安全的方式查询任何已编译的.NET方法,而不是表达式。
LINQ To Anything - 检查System.Linq.Queryable的一些查询方法。这些方法针对IQueryable<T>
,允许构建可由底层实现翻译的表达式树。
表达式树 - 检查System.Linq.Expressions命名空间。这是代表代码的数据。实际上,您应该了解这些内容,但不需要直接使用这些类型编写代码。语言特性(如lambda表达式)可以允许您使用各种简写来避免直接处理这些类型。
LINQ To SQL - 查看System.Data.Linq命名空间,并特别注意DataContext
。这是由C#团队构建的数据访问技术,使用起来非常简单。
LINQ To Entities - 查看System.Data.Objects命名空间,并特别注意ObjectContext
。这是由ADO.NET团队构建的数据访问技术,功能复杂、强大,但使用起来比LINQ To SQL更为困难。
LINQ To XML - 查看System.Xml.Linq命名空间。本质上,人们对System.Xml
中的内容不满意。因此,微软进行了重新编写并利用这次重写引入了一些使得使用LINQ To Objects操作XML更加容易的方法。
以上所有内容都是.NET Framework的一部分,可从任何.NET语言(如VB.NET、C#、IronPython、COBOL .NET等)中使用。
好的,接下来是语言特性。我将专注于C#,因为这是我最熟悉的语言。VB.NET也有几个类似的改进(以及一些C#没有获得的——XML文字)。以下是一个简短而不完整的列表。
扩展方法 - 这允许您"添加"一个方法到类型中。该方法实际上是一个静态方法,它接收一个类型的实例,并且受限于类型的公共契约,但它非常适用于向您无法控制的类型(例如字符串)添加自定义方法,或者向接口添加(完全实现的)帮助方法。
查询推导语法 - 这允许您以类似SQL的结构编写查询语句。所有这些内容都会转换为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#编译器将其转换为匿名方法或真正的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);
LINQ(Language INtegrated Query)可能指:
用于集合和迭代器操作的库,广泛使用高阶函数作为参数(System.Linq)
用于传递和操作简单函数的抽象语法树的库(System.Linq.Expressions)
各种语言的语法扩展,提供更类似SQL的语法来处理集合,更紧凑的匿名函数符号表示法,以及通过语法无法区分的静态帮助函数引入机制。
接口定义,数据提供程序可以符合该定义以接收查询结构,并可能对其进行优化。有时也指兼容的数据提供程序本身。
这些组件可以单独使用或组合使用。
From Where Select
等形式 - 也就是应该按照实际形成结果集的方式来编写。 - Don Cheadle[1] 这些是关系型术语,函数式编程者可能更喜欢Map、Reduce、Fold等。
http://msdn.microsoft.com/en-us/netframework/aa904594.aspx
“LINQ 项目是 .NET Framework 的一组扩展,包括语言集成查询、集合和转换操作。它通过本地语言语法为 C# 和 Visual Basic 提供查询功能,并提供类库以利用这些能力。”