LINQ – 概述
LINQ – 概述
世界各地的开发者在查询数据时总是遇到问题,因为缺乏明确的路径,需要掌握多种技术,如SQL、Web Services、XQuery等。
LINQ(语言集成查询)在 Visual Studio 2008 中引入并由 Anders Hejlsberg 设计,即使不了解 SQL、XML 等查询语言,也可以编写查询。LINQ 查询可以针对不同的数据类型编写。
LINQ 查询示例
C#
using System; using System.Linq; class Program { static void Main() { string[] words = {"hello", "wonderful", "LINQ", "beautiful", "world"}; //Get only short words var shortWords = from word in words where word.Length <= 5 select word; //Print each word out foreach (var word in shortWords) { Console.WriteLine(word); } Console.ReadLine(); } }
VB
Module Module1 Sub Main() Dim words As String() = {"hello", "wonderful", "LINQ", "beautiful", "world"} ' Get only short words Dim shortWords = From word In words _ Where word.Length <= 5 _ Select word ' Print each word out. For Each word In shortWords Console.WriteLine(word) Next Console.ReadLine() End Sub End Module
编译并执行上述 C# 或 VB 代码时,会产生以下结果 –
hello LINQ world
LINQ 的语法
LINQ 有两种语法。这些是以下内容。
Lamda(方法)语法
var longWords = words.Where( w ⇒ w.length > 10); Dim longWords = words.Where(Function(w) w.length > 10)
查询(理解)语法
var longwords = from w in words where w.length > 10; Dim longwords = from w in words where w.length > 10
LINQ 的类型
下面简要介绍了 LINQ 的类型。
- LINQ 到对象
- LINQ 转 XML(XLINQ)
- LINQ 到数据集
- LINQ 到 SQL (DLINQ)
- LINQ 到实体
除了上述之外,还有一个名为 PLINQ 的 LINQ 类型,它是微软的并行 LINQ。
.NET 中的 LINQ 架构
LINQ 具有 3 层体系结构,其中最上层由语言扩展组成,底层由数据源组成,这些数据源通常是实现 IEnumerable <T> 或 IQueryable <T> 通用接口的对象。架构如下所示。
查询表达式
查询表达式只不过是一个 LINQ 查询,以类似于 SQL 的形式表达,带有 Select、Where 和 OrderBy 等查询运算符。查询表达式通常以关键字“From”开头。
要访问标准的 LINQ 查询运算符,默认情况下应导入命名空间 System.Query。这些表达式是用 C# 3.0 的声明式查询语法编写的。
下面的示例展示了一个完整的查询操作,它包括数据源创建、查询表达式定义和查询执行。
C#
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Operators { class LINQQueryExpressions { static void Main() { // Specify the data source. int[] scores = new int[] { 97, 92, 81, 60 }; // Define the query expression. IEnumerable<int> scoreQuery = from score in scores where score > 80 select score; // Execute the query. foreach (int i in scoreQuery) { Console.Write(i + " "); } Console.ReadLine(); } } }
当上面的代码被编译和执行时,它会产生以下结果 –
97 92 81
扩展方法
在 .NET 3.5 中引入的扩展方法仅在静态类中声明,并允许将自定义方法包含到对象中以执行一些精确的查询操作来扩展类,而不是该类的实际成员。这些也可以过载。
简而言之,扩展方法用于将查询表达式转换为传统的方法调用(面向对象)。
LINQ 和存储过程的区别
LINQ 和存储过程之间存在一系列差异。下面提到了这些差异。
-
存储过程比 LINQ 查询快得多,因为它们遵循预期的执行计划。
-
与存储过程相比,执行 LINQ 查询时避免运行时错误更容易,因为前者具有 Visual Studio 的智能感知支持以及编译时期间的完整类型检查。
-
LINQ 允许使用 .NET 调试器进行调试,这不是存储过程。
-
与存储过程相比,LINQ 提供对多个数据库的支持,在存储过程中,必须为不同类型的数据库重新编写代码。
-
与部署一组存储过程相比,基于 LINQ 的解决方案的部署简单易行。
需要 LINQ
在使用 LINQ 之前,必须学习 C#、SQL 和将两者结合在一起以形成完整应用程序的各种 API。因为,这些数据源和编程语言面临阻抗不匹配;感觉需要简短的编码。
下面是一个示例,说明在 LINQ 出现之前,开发人员在查询数据时使用了多少不同的技术。
SqlConnection sqlConnection = new SqlConnection(connectString); SqlConnection.Open(); System.Data.SqlClient.SqlCommand sqlCommand = new SqlCommand(); sqlCommand.Connection = sqlConnection; sqlCommand.CommandText = "Select * from Customer"; return sqlCommand.ExecuteReader (CommandBehavior.CloseConnection)
有趣的是,在特色代码行中,查询仅由最后两个定义。使用 LINQ,可以在更短的时间内以可读的颜色编码形式编写相同的数据查询,如下面提到的形式。
Northwind db = new Northwind(@"C:\Data\Northwnd.mdf"); var query = from c in db.Customers select c;
LINQ的优势
LINQ 提供了许多优点,其中最重要的是其强大的表达能力,使开发人员能够以声明方式进行表达。下面给出了 LINQ 的其他一些优点。
-
LINQ 提供了语法高亮,证明有助于在设计时找出错误。
-
LINQ 提供 IntelliSense,这意味着轻松编写更准确的查询。
-
在 LINQ 中编写代码的速度相当快,因此开发时间也显着减少。
-
由于 LINQ 集成在 C# 语言中,因此可以轻松调试。
-
由于其分层功能,使用 LINQ 可以轻松查看两个表之间的关系,这使得在更短的时间内组合多个表的查询成为可能。
-
LINQ 允许在查询许多不同的数据源时使用单一的 LINQ 语法,这主要是因为它的统一基础。
-
LINQ 是可扩展的,这意味着可以使用 LINQ 的知识来查询新的数据源类型。
-
LINQ 提供了在单个查询中连接多个数据源以及将复杂问题分解为一组易于调试的短查询的功能。
-
LINQ 提供了将一种数据类型转换为另一种数据类型的简单转换,例如将 SQL 数据转换为 XML 数据。