LinQ教學

世界各地的開發者總是遇到查詢的問題,因爲缺乏一個定義的路徑的數據,並需要掌握的技術,如SQL,Web服務的XQuery等。

在Visual Studio 2008中引入,由Anders Hejlsberg設計LINQ(語言集成查詢)允許編寫查詢,即使沒有查詢語言,如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)

  • Query (理解) 語法

    示例

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

LINQ的類型

LINQ的類型在下面簡要提及。

  • LINQ 到 Objects
  • LINQ 到XML(XLINQ)
  • LINQ 到 DataSet
  • LINQ 到 SQL (DLINQ)
  • LINQ 到 Entities

除上述外,還有一個名爲PLINQ一個LINQ類型,這是微軟並行LINQ。

在.NETLINQ體系結構

LINQ有3層架構,其中最上層是由語言擴展和底層組成,通常對象實現了IEnumerable或IQueryable的泛型接口的數據源。該體系結構如下圖。

LINQ

查詢表達式

查詢表達式不過是一個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 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

擴展方法

引入.NET3.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提供智能感知這意味着很容易寫更精確的查詢。

  • 寫LINQ代碼是相當快的,因此開發時間也被顯著減少。

  • LINQ使得調試方便,因爲它在C#語言的集成。

  • 兩個表之間的關係看很容易使用LINQ由於其分層特徵,這使得編寫查詢在更短的時間加入多個表。

  • LINQ允許一個單一的LINQ語法的使用,同時查詢多個不同的數據源,這是主要是因爲其統一的基礎。

  • LINQ是可擴展的,這意味着有可能使用LINQ的知識來查詢新的數據源類型。

  • LINQ提供了一個查詢連接多個數據源,以及突破複雜問題轉換爲一組短的查詢易於調試的工具。

  • LINQ提供易於改造轉換一種數據類型到另一種,如SQL數據轉換爲XML數據。