如今,许多业务开发人员必须使用两种(或更多)编程语言:业务逻辑和呈现层(如 Visual C# 或 Visual Basic)的高级语言,以及与数据库交互的查询语言(如 Transact-SQL)。 这要求开发人员精通多种语言才能有效,也会导致开发环境中的语言不匹配。 例如,使用数据访问 API 对数据库执行查询的应用程序使用引号将查询指定为字符串文本。 此查询字符串对编译器不可读,并且未检查是否存在错误,例如语法无效,或者它引用的列或行是否实际存在。 查询参数没有类型检查,也不支持IntelliSense
。
Language-Integrated 查询(LINQ)使开发人员能够在应用程序代码中形成基于集的查询,而无需使用单独的查询语言。 可以针对各种可枚举数据源(即实现 IEnumerable 接口的数据源)编写 LINQ 查询,例如内存中数据结构、XML 文档、SQL 数据库和 DataSet 对象。 尽管这些可枚举数据源以各种方式实现,但它们都公开相同的语法和语言构造。 由于查询可以用编程语言本身形成,因此不必使用嵌入为编译器无法理解或验证的字符串文本的另一种查询语言。 将查询集成到编程语言中还可以通过提供编译时类型和语法检查,从而使 Visual Studio 程序员的工作效率更高 IntelliSense
。 这些功能减少了查询调试和错误修复的需求。
将数据从 SQL 表传输到内存中的对象通常是繁琐且容易出错的。 LINQ to DataSet 和 LINQ to SQL 实现的 LINQ 提供程序可将源数据转换为基于 IEnumerable 的对象集合。 程序员始终在查询和更新时将数据视为 IEnumerable 集合。 提供完整的 IntelliSense
支持,用于编写针对这些集合的查询。
有三种不同的 ADO.NET Language-Integrated查询(LINQ)技术:LINQ to DataSet、LINQ to SQL 和 LINQ to Entities。 LINQ to DataSet 提供丰富的且针对 DataSet 优化的查询,LINQ to SQL 可用于直接查询 SQL Server 数据库架构,而 LINQ to Entities 可用于查询实体数据模型。
下图概述了 ADO.NET LINQ 技术与高级编程语言和支持 LINQ 的数据源的关系。
有关 LINQ 的详细信息,请参阅语言集成查询(LINQ)。
以下部分提供有关 LINQ to DataSet、LINQ to SQL 和 LINQ to Entities 的详细信息。
LINQ to DataSet
DataSet 是 ADO.NET 构建的断开连接编程模型中的核心组件,并被广泛使用。 LINQ to DataSet 使开发人员能够使用可用于许多其他数据源的同一查询制定机制,将更丰富的查询功能构建到 DataSet 其中。 有关详细信息,请参阅 LINQ to DataSet。
LINQ to SQL
LINQ to SQL 是一个有用的工具,适用于不需要映射到概念模型的开发人员。 通过使用 LINQ to SQL,可以直接通过现有数据库架构使用 LINQ 编程模型。 LINQ to SQL 使开发人员能够生成表示数据的 .NET Framework 类。 这些生成的类不映射到概念数据模型,而是直接映射到数据库表、视图、存储过程和用户定义的函数。
借助 LINQ to SQL,开发人员可以使用与内存中集合相同的 LINQ 编程模式和 DataSetXML 等其他数据源,直接针对存储架构编写代码。 有关详细信息,请参阅 LINQ to SQL。
LINQ to Entities
大多数应用程序当前都以关系数据库为基础编写。 在某些时候,这些应用程序需要与关系形式中表示的数据进行交互。 数据库架构并不总是用于生成应用程序,应用程序的概念模型与数据库的逻辑模型不同。 实体数据模型是一种概念数据模型,可用于为特定域的数据建模,以便应用程序可以将数据作为对象进行交互。 有关详细信息,请参阅 ADO.NET Entity Framework。
通过实体数据模型,关系数据作为 .NET 环境中的对象公开。 这使得对象层成为 LINQ 支持的理想目标,使开发人员能够根据用于生成业务逻辑的语言针对数据库制定查询。 此功能称为 LINQ to Entities。 有关详细信息,请参阅 LINQ to Entities。