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<T>或IQueryable的<T>泛型介面的資料源。該體系結構如下圖。

LINQ Architecture

查詢表示式

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

擴充套件方法

引入.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資料。