LINQ - 概述
世界各地的開發人員一直以來在查詢資料方面遇到問題,因為缺乏明確的路徑,並且需要掌握多種技術,例如 SQL、Web 服務、XQuery 等。
LINQ(語言整合查詢)由 Anders Hejlsberg 設計,在 Visual Studio 2008 中引入,允許即使不瞭解 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 有兩種語法。如下所示。
Lambda(方法)語法
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 to Objects
- LINQ to XML (XLINQ)
- LINQ to DataSet
- LINQ to SQL (DLINQ)
- LINQ to Entities
除了上述內容外,還有一種名為 PLINQ 的 LINQ 型別,它是微軟的並行 LINQ。
.NET 中的 LINQ 架構
LINQ 在 .NET 中採用三層架構,最頂層是語言擴充套件,底層是資料來源,這些資料來源通常是實現了 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 的 IntelliSense 支援以及編譯時的完全型別檢查。
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 資料。