這幾天在讀一本LINQ方面的書《Essential LINQ》,在這裡和大家分享下。
由於對LINQ的深入總結需要大量的篇幅,因此在這裡分成幾個部分來講。
(*我看《Essential LINQ》是英文版的,有些名詞不能翻譯成正統的中文解釋請給予諒解)
LINQ的優點:
LINQ基本有以下七個優點,讓我來一一舉例說明:
1.Integrated:所謂的Integrated(整合化),LINQ是從以下方面體現整合的:
(1):把查詢文法融入了C#(VB)這些語言中,讓他變成了一種文法。這樣就能和C#中的其他文法一樣支援:
語句高亮顯示,類型檢查,允許使用debugger調試
(2):把以前複雜的查詢前的工作都整合封裝起來,讓開發人員側重於查詢。
(3):整合後的文法更加的清晰易懂,可讀性較高。
比較:
//原來的格式 SqlConnection sqlConn = new SqlConnection(connectionString); sqlConn.Open(); SqlCommand command = new SqlCommand(); command.Connection = sqlConn; command.CommandText = "Select * From Customer"; SqlDataReader dataReader = command.ExecuteReader(CommandBehavior.CloseConnection); //LINQ的格式 NORTHWNDDataContext dc = new NORTHWNDDataContext(); var query = from c in dc.Customers select c;
2.Unitive:所謂Unitive(統一化)就指不管對任何類型外部和內部資料來源(對象集合,xlm,資料庫資料)都使用統一的查詢文法。
使用統一化查詢語言的好處在於以下幾點:
- 你不用因為要使用不太熟悉的資料來源而花很多精力去瞭解它,你可以快速簡單的使用LINQ文法對起查詢。
- 由於使用了統一的文法,可以使代碼維護變的更加簡單。
以下代碼體現了LINQ的統一化:
//資料來源:對象集合var query = from c in GetCustomers() select c;//資料來源:SQLvar query1 = from c in dc.Customers select c;//資料來源:XMLvar query2 = from c in customers.Descendants("Customer") select c;
3.Extensible:所謂Extensible(可擴充)指以下2個方面:
(1).可查詢資料來源的擴充。 LINQ提供了個LINQ provider model,你可以為LINQ建立或提供provider讓LINQ支援更多的資料來源。
(2).可擴充查詢方法。開發人員可以根據自己的需求為LINQ重寫和擴充查詢方法。
以下是些第三方的LINQ provider:
LINQ Extender, LINQ to JavaScript, LINQ to JSON, LINQ to MySQL, LINQ to Flickr, LINQ to Google
4.Declarative:所謂Declarative(聲明式),簡單的來說指的是開發人員只要告訴程式做什麼,程式自己判斷怎麼做。
Declarative programming(聲明式編程)的優點體現在以下2點:
(1).提高了開發速度。因為開發人員不用書寫大量的代碼來具體化執行步驟,只許告訴程式做什麼。
(2).提高代碼最佳化空間。因為開發人員不用參與幹涉對程式執行的具體步驟,這樣就提供給編譯器更多的空間去最佳化代碼。
舉例SQL來說,LINQ產生的SQL語句往往比一對SQL水平一般的開發人員能寫出更好的SQL語句。
比較Declarative programming 與 Imperative programming:
//聲明式編程List<List<int>> lists = new List<List<int>> { new List<int> { 1, 2, 3 }, new List<int> { 4, 5 } };var query = from list in lists from num in list where num % 3 == 0 orderby num descending select num;//命令式編程List<int> list1 = new List<int>();list1.Add(1);list1.Add(2);list1.Add(3);List<int> list2 = new List<int>();list2.Add(4);list2.Add(5);List<List<int>> lists1 = new List<List<int>>();lists1.Add(list1);lists1.Add(list2);List<int> newList = new List<int>();foreach (var item in lists1) foreach (var num in item) if (num % 3 == 0) newList.Add(num);newList.Reverse();
5.Hierarchical:所謂Hierarchical(層次化)指使用物件導向的方式抽象資料。
SQL是關係型資料庫,它以關係的方式描述資料以資料的聯絡,但我們的程式設計成物件導向的因此我們在程式裡得到的資料庫資料往往都是
rectangular grid(平面的顯示資料)。但是LINQ通過所謂的O-R Mapping方式,把關係型轉換成對象與對象方式描述資料。
這樣帶來的好處是:開發人員能直接以對象的方式去操作資料,對習慣物件導向的開發人員來說物件導向模型更易理解。
6.Composable:所謂Composable(可組成)指LINQ可以把一個複雜的查詢拆分成多個簡單查詢。
LINQ返回的結果都是基於介面:IEnumerable<T>,因此能對查詢結果繼續查詢,而且LINQ具有順延強制的特性因此拆分執行不會影響效率。
優點在於:
(1).方便調試。把複雜的查詢拆分成簡單的查詢,然後逐個調試。
(2).便於代碼維護。把代碼拆分後能使代碼變的更易理解。
以下代碼體現了可組成性:
//以下代碼體現了ComposableList<List<int>> lists = new List<List<int>> { new List<int> { 1, 2, 3 }, new List<int> { 4, 5 } };var query1 = from list in lists from num in list select num;var query2 = from num in query1 where num % 3 == 0 select num;var query3 = from num in query2 orderby num descending select num;
7.Transformative:所謂Transformative(可轉換)指的是LINQ能把一種資料來源的內容轉換到其他資料來源。
方便使用者做資料移植。
以下代碼體現了轉換的特性:
//把關係型資料轉換成XML型var query = new XElement("Orders", from c in dc.Customers where c.City == "Paris" select new XElement("Order", new XAttribute("Address", c.Address)));
以上就是LINQ的幾大優點,很高興能在這裡和大家分享。有任何不足之處請給予補充和糾正,謝謝光臨小舍。
//2011/1/28 補充(LINQ TO SQL)
在LINQ TO SQL 方面,如果使用LINQ TO SQL可以有效防止SQL注入,LINQ TO SQL 會把注入的代碼當做無用的參數處理。