This article has been localized into Chinese by the community.
简单介绍
语言集成查询,简称 LINQ,是 .NET 框架内置的一项技术。该技术能够让你在多种数据源中轻松查询并操作相应的数据。换句话来说,无论数据源是一个简单的列表,字典,XML文件亦或者是数据库中的表,你都能以同一种方式来处理数据。LINQ 有两种语法风格:查询语法和方法语法。我们会在之后的文章中详细讨论这两种语法,但为了让你对 LINQ 有一定的认识,这里我快速演示一个例子来演示 LINQ 如何优雅地查询一个简单的数据源:
var names = new List<string>()
{
"John Doe",
"Jane Doe",
"Jenna Doe",
"Joe Doe"
};
// Get the names which are 8 characters or less, using LINQ
var shortNames = from name in names where name.Length <= 8 orderby name.Length select name;
foreach (var name in shortNames)
Console.WriteLine(name);
使用 LINQ 的查询语法,仅仅只需要一行代码,就可以获得满足以下要求的所有名字:这些名字的长度不超过8个字符并且他们会按照长度升序排序!只需要一行代码就可以做到上述所有的功能,并且这个例子只展示了 LINQ 能做的一小部分而已。在接下来的文章中,我将向你介绍使用 LINQ 的惊人的可能性,但在此之前,我们需要讨论下 LINQ 的查询语句是在何时以及如何执行的。
延迟执行
大多数程序员习惯看到代码一行一行地得到执行,然而,这里,当程序运行到查询部分时,并不会执行 LINQ 的查询,这一点会让人非常吃惊。只有当你开始使用数据时,比如调用相关方法像 ToList() 或者是 Count() 方法,LINQ 语句才会得到执行。这也就意味着你可以构建多行的查询语句,在查询过程中执行多个查询操作,而在你需要处理这些数据时才会获取这些数据。这里,我对之前的例子进行扩充来进行说明,在这个例子中,我们使用方法语法来替换原先的查询语法:
var names = new List<string>()
{
"John Doe",
"Jane Doe",
"Jenna Doe",
"Joe Doe"
};
// Get the names which are 8 characters or less, using LINQ
var shortNames = names.Where(name => name.Length <= 8);
// Order it by length
shortNames = shortNames.OrderBy(name => name.Length);
// Add a name to the original list
names.Add("Zoe Doe");
// Iterate over it - the query has not actually been executed yet!
// It will be as soon as we hit the foreach loop though!
foreach (var name in shortNames)
Console.WriteLine(name);
在这个例子中,我已经添加了相关注释,因而会比较容易理解。另外,请注意下我所添加的语句,也就是在查询完成后,我向原始列表中添加了一个新名字。现在,如果已经执行了查询语句,那么新添加的名字当然不会出现在结果之中,然而,它的确出现了。这是因为添加语句是在查询之后且真正使用数据之前所添加的。这里,数据在 foreach 循环中得到使用的。
对于只包含 4、5 个名字的带查询列表来说,查询的处理时机并不重要。但考虑这样的一种情况,如果我们有一个包含 1000 万的实体列表或者其他某处的远程数据库时,当执行一条查询语句时不需要查询多次,这点是非常重要的。
概述
LINQ 可以让你使用查询语法或者是方法语法简单并自然地查询多种数据源,这一点将在之后的文章中进行讨论。