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數據。