第 8 章 LINQ 查询 LINQ 查询
本作品已使用人工智能进行翻译。欢迎您提供反馈和意见:translation-feedback@oreilly.com
LINQ 或 Language Integrated Query(语言集成查询)是一套语言和运行时功能,用于编写对本地对象集合和远程数据源的结构化类型安全查询。
LINQ 使您能够查询任何实现IEnumerable<T> 的集合,无论是数组、列表还是 XML 文档对象模型(DOM),以及远程数据源,如 SQL Server 数据库中的表。LINQ 具有编译时类型检查和动态查询组合的优点。
本章介绍 LINQ 体系结构和编写查询的基础知识。所有核心类型都定义在System.Linq 和System.Linq.Expressions 命名空间中。
备注
本章和随后两章中的示例已预装到名为 LINQPad 的交互式查询工具中。您可以从http://www.linqpad.net 下载 LINQPad。
入门
LINQ 的基本数据单元是序列和元素。序列是实现 的任何对象,元素是序列中的每个项。在下面的示例中, 是序列, 、 和 是IEnumerable<T> names "Tom" "Dick" "Harry" 元素:
string[] names = { "Tom", "Dick", "Harry" };
我们称其为本地序列,因为它代表内存中的本地对象集合。
查询操作符是一种转换序列的方法。典型的查询操作符接受一个输入序列,并输出一个转换后的输出序列。在System.Linq 的Enumerable 类中,有大约 40 个查询操作符--全部作为静态扩展方法实现。这些运算符被称为标准查询运算符。
备注
对本地序列进行操作的查询称为本地查询或LINQ 到对象查询。
LINQ 还支持可从远程数据源(如 SQL Server 数据库)动态输入的序列。这些序列另外还实现了IQueryable<T> 接口,并通过Queryable 类中的一组标准查询操作符得到支持。我们将在"解释查询 "中对此作进一步讨论。
查询是一种表达式,在枚举时,用查询运算符转换序列。最简单的查询由一个输入序列和一个操作符组成。例如,我们可以在一个简单数组上应用Where 操作符,提取长度至少为 4 个字符的字符串,如下所示:
string[] names = { "Tom", "Dick", "Harry" };
IEnumerable<string> filteredNames = System.Linq.Enumerable.Where
(names, n => n.Length >= 4);
foreach (string n in filteredNames)
Console.WriteLine (n);
Dick
Harry
因为标准查询操作符是作为扩展方法实现的,所以我们可以直接在names 上调用Where ,就好像它是一个实例方法一样:
IEnumerable<string> filteredNames = names.Where (n => n.Length >= 4);
要编译此代码,必须导入System.Linq 命名空间。下面是一个完整的示例:
using System;
using System.Collections.Generic;
using System.Linq;
string[] names = { "Tom", "Dick", "Harry" };
IEnumerable<string> ...Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access