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查詢,表示類似於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數據。