天天看點

LINQ的優勢

這是在外面轉載的一篇關于linq優點的文章, 總結的很好,但是感覺還有優點沒有總結出來。 以後我會在這裡面在添加進來 ,并試着去總結一下 确定

這幾天在讀一本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;

//資料源:SQL

var query1 = from c

in

dc.Customers

select c;

//資料源:XML

var 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).便于代碼維護。把代碼拆分後能使代碼變的更易了解。

以下代碼展現了可組成性:

//以下代碼展現了Composable

List<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的幾大優點,很高興能在這裡和大家分享。有任何不足之處請給予補充和糾正,謝謝光臨小舍。