第 10 章 LINQ LINQ
本作品已使用人工智能进行翻译。欢迎您提供反馈和意见:translation-feedback@oreilly.com
语言集成查询(LINQ)是一个强大的 C# 语言功能集合,用于处理信息集。它适用于任何需要处理多个数据的应用程序(即几乎任何应用程序)。虽然 LINQ 的最初目标之一是提供对关系数据库的直接访问,但它适用于多种信息。例如,它还可用于内存对象模型、基于 HTTP 的信息服务、JSON 和 XML文档。
LINQ 并不是一个单一的功能。它依赖于几个协同工作的语言元素。与 LINQ 相关的最显著的语言特性是查询表达式,它是一种表达式形式,与数据库查询大致相似,但可用于对任何支持的源执行查询,包括普通对象。正如你所看到的,查询表达式在很大程度上依赖于其他一些语言特性,如 Lambda、扩展方法和表达式对象模型。
语言支持只是成功的一半。LINQ 需要类库来实现一组称为LINQ 操作符的查询原语。每种不同的数据都需要自己的实现,针对任何特定信息类型的操作符集被称为LINQ 提供程序。(顺便说一下,这些也可以在 Visual Basic 和 F# 中使用,因为这些语言也支持 LINQ)。微软提供了几种提供程序,有些内置于 .NET 类库中,有些则作为单独的 NuGet 包提供。比如 Entity Framework 就有一个提供程序,这是一个用于数据库的对象/关系映射系统。他们为 Cosmos DB 云数据库(Microsoft Azure 的一项功能)提供了一个 LINQ 提供程序。第11章中介绍的.NET反应扩展(Rx)为实时数据流提供了LINQ支持。总之,LINQ 是 .NET 中得到广泛支持的成语,而且具有可扩展性,因此您还可以找到开源和其他第三方提供程序。
本章中的大多数示例都使用了 LINQ to Objects。这样做的部分原因是避免了数据库或服务连接等无关细节对示例的干扰,但还有一个更重要的原因。2007 年 LINQ 的引入极大地改变了我编写 C# 的方式,这完全是因为 LINQ to Objects 的存在。虽然 LINQ 的查询语法让人觉得它主要是一种数据访问技术,但我发现它的价值远不止于此。在任何对象集合上都可以使用 LINQ 的服务,这使得它在代码的每个部分都非常有用。
查询表达式
LINQ 最明显的特征是查询表达式语法。这并不是最重要的--正如我们稍后将看到的,完全可以在不编写查询表达式的情况下有效地使用 LINQ。不过,对于许多类型的查询来说,这是一种非常自然的语法。
乍一看,查询表达式与数据库查询很相似,但其语法适用于任何 LINQ 提供程序。例 10-1显示了一个使用 LINQ to Objects 搜索某些CultureInfo 对象的查询表达式。(CultureInfo 对象提供了一组特定于文化的信息,如当地货币使用的符号、使用的语言等。有些系统称其为 "locale")。这个特定的查询会查看表示英语中小数点的字符。许多国家实际上使用逗号而不是句号,在这些国家,100,000 表示将数字 100 写到小数点后三位;而在英语文化中,我们通常将其写成 100.000。查询表达式会搜索系统已知的所有文化,并返回那些使用逗号作为小数分隔符的文化。
例 10-1. LINQ 查询表达式
IEnumerable<CultureInfo>commaCultures=fromcultureinCultureInfo.GetCultures(CultureTypes.AllCultures ...
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