Linq 简明教程

LINQ - Overview

由于缺少明确的路径,并需要精通 SQL、Web 服务、XQuery 等多项技术,世界各地的开发人员在查询数据时总会遇到问题。

LINQ(语言集成查询)由 Anders Hejlsberg 设计,在 Visual Studio 2008 中引入,允许编写查询,即使不知道 SQL、XML 等查询语言。可为不同数据类型编写 LINQ 查询。

Example of a LINQ query

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

Syntax of LINQ

LINQ 的语法有两种。它们如下所示。

Lamda (Method) Syntax

var longWords = words.Where( w ⇒ w.length > 10);
Dim longWords = words.Where(Function(w) w.length > 10)

Query (Comprehension) Syntax

var longwords = from w in words where w.length > 10;
Dim longwords = from w in words where w.length > 10

Types of LINQ

LINQ 的类型概述如下。

  1. LINQ to Objects

  2. LINQ to XML(XLINQ)

  3. LINQ to DataSet

  4. LINQ to SQL (DLINQ)

  5. LINQ to Entities

除了上述类型之外,还有一个名为 PLINQ 的 LINQ 类型,它是 Microsoft 提供的并行 LINQ。

LINQ Architecture in .NET

LINQ 具有一个 3 层架构,其中最上层由语言扩展组成,最底层由通常实现 IEnumerable 或 IQueryable 通用接口的对象(数据源)组成。该架构如下所示。

linq architecture

Query Expressions

查询表达式只不过是一个 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

Extension Methods

使用 .NET 3.5 引入,仅在静态类中声明扩展方法,并允许将自定义方法包含到对象中,以执行一些精确的查询操作,而无需成为该类的实际成员。这些方法还可以重载。

简而言之,扩展方法用于将查询表达式转换为传统方法调用(面向对象)。

Difference between LINQ and Stored Procedure

LINQ 和存储过程之间有很多差异。这些差异如下所述。

  1. 存储过程要比 LINQ 查询快得多,因为它们遵循预期的执行计划。

  2. 执行 LINQ 查询比存储过程更容易避免运行时错误,因为前者具有 Visual Studio 的 Intellisense 支持以及编译时的完全类型检查。

  3. LINQ 允许通过使用存储过程不存在的 .NET 调试器进行调试。

  4. LINQ 支持多个数据库,而存储过程则不同,存储过程需要为不同类型的数据库重写代码。

  5. 基于 LINQ 的解决方案的部署比部署一组存储过程更容易、更简单。

Need For 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,相同的 data 查询可以用可读的彩色彩色形式编写,如下所示,而且时间非常短。

Northwind db = new Northwind(@"C:\Data\Northwnd.mdf");
var query = from c in db.Customers select c;

Advantages of LINQ

LINQ 提供了许多优势,其中首要优势是其强大的表达能力,使开发人员能够以声明方式表达。以下列出了 LINQ 的其他一些优势。

  1. LINQ 提供语法高亮显示,这有助于在设计时发现错误。

  2. LINQ 提供 IntelliSense,这意味着可以轻松编写更准确的查询。

  3. 在 LINQ 中编写代码的速度非常快,因此开发时间也大大缩短。

  4. 由于 LINQ 集成在 C# 语言中,所以易于调试。

  5. 由于 LINQ 层次化的特性,所以轻松查看两个表之间的关系,这可以在更短的时间内通过连接多个表组成查询。

  6. LINQ 允许在查询多个不同数据源时使用单一的 LINQ 语法,这主要是因为它的统一基础。

  7. LINQ 是可扩展的,这意味着可以使用 LINQ 知识查询新的数据源类型。

  8. LINQ 提供连接多个数据源于一个查询以及将复杂的问题分解为一组易于调试的简短查询的功能。

  9. LINQ 提供了轻松的转换功能,例如将一种数据类型转换为另一种数据类型,例将 SQL 数据转换为 XML 数据。