成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

淺談LINQ to SQL集成數據庫語言優劣

開發 后端
Linq To SQL是Microsoft開發的針對解決data!=object問題的新技術。在筆者的一系列的文章中,對它已經做了大量的介紹。現在,筆者將從經驗的角度,談談它的優劣。

1、LINQ to SQL的優點

在LINQ to SQL推出之前,我們只是把SQL語句形成一個string,然后,通過ado.net傳給SQLserver,返回結果集.這里的缺陷就是,如果你SQL語句寫的有問題,只有到運行時才知道.而且并不所有的人都懂數據庫的。LINQ to SQL在一切圍繞數據的項目內都可以使用。特別是在項目中缺少SQL Server方面的專家時,LINQ to SQL的強大的功能可以幫我們快速的完成項目。LINQ to SQL的推出,是讓大家從煩瑣的技術細節中解脫出來,更加關注項目的邏輯。LINQto SQL的出現,大大降低了數據庫應用程序開發的門楷,它實質是事先為你構架了數據訪問層,勢必將加快數據庫應用程序的開發進度。LINQ to SQL解放了眾多程序員,讓他們的把更多的精力放到業務邏輯以及code上,而不是數據庫。對于初學者來講,LINQ to SQL可以讓他們迅速進入數據庫應用程序開發領域,節約了培訓成本。

LINQ to SQL的實現,是在ado.net和C#2.0的基礎上的。它通過自動翻譯SQL語句,并把結果集創建成對象并返回。這里我們可以看出,發送到SQLServer端的SQL語句是LINQ to SQL自動生成的。這對不懂SQL的人來說,無疑是個福音。第二,LINQ to SQL語句是在編譯期間就做檢查的。而不是運行時檢查。這樣,那里出了問題,可以及時更改,而不是到了運行時才發現問題。第三,LINQ to SQL是針對對象操作的,更符合今天的oo呼聲。

在LINQ to SQL之前,在Java領域有Hibernate,在net領域有NHibernate技術,來實現object/relational持久和查詢服務。那和NHibernate比起來,它又有那些優勢呢.第一,影射代碼自動生成。VS2008提供了SQLMetal和ORDesigner兩個工具來完成此步驟。而在NHibernate中,你不得不自己手工寫。第二,影射代碼有更多的選擇.NHibernate只能把數據庫的信息配置在一個xml中,而LINQ to SQL有兩種方式,一個是放到XML中,我們稱為Externl Mapping,再一種就是以Attribute的形式,存在于各個property中。當然,筆者本人并沒有使用過NHibernate,只是從資料上得到這些消息,所以無法給出更多的比較。

2、LINQ to SQL的缺點

很久前,有個網友問到這么一個問題。他在界面上有個DataView,里面綁定了一些Column,然后他勾選那一列就按某列排序。其傳回的參數是列的名字。然后問我該怎么用DLINQ 來實現。

在以前拼接SQL語句的年代,這個很簡單,一個" order by " + string,想按什么排就按什么來排。而現在dLINQ是用是一個對象的屬性,已經不可能拼接了。我當時給他的答案是這樣的。

以下是引用片段:

private void Methods(string orderId) 
{
var q = db.Customers.Select(c=>c);

switch(orderId)
{
case "ID":
q = q.OrderBy(c=>c.ID);
break;
case "Name":
q = q.OrderBy(c=>c.Name);
break;
default:
break;
}

var result = q.toList();
}

我那時也沒有想出一個更好的方案來。而后告訴他去查下Compiled Query,說不定可以找到更方便的。后來我才在這個例子中,看到更方便的。

以下是引用片段:

var query = 
db.Customers.Where("City == @0 and Orders.Count >= @1", "London", 10).
OrderBy("CompanyName").
Select("New(CompanyName as Name, Phone)");

在這里OrderBy直接接收的就是列的名字。再仔細一看,好像Where里是LINQ的語句哎,那OrderBy也該是LINQ語句。后來,我把CompanyName換成小寫的,一跑過了。莫非真的是列的名字?出個難題吧。找了一個列名,是帶空格的,重新來建這個工程.一跑,錯了!把列名用中國擴號擴起來了,也是錯了。咳,只是動態構造ExpressionTree而已,永遠都不能直接接收列的名字。這個例子看著是很簡單,可不知道你有沒有注意到它有一個80多k的Dynamic.cs文件。更有意思的事情是,它的名稱空間是System.LINQ.Dynamic.看樣子,ms本來是打算把它加在.net3.5中嗎.不曉得為什么放到了例子中了。這個名稱空間下,其主要內容就是動態構造Expression Tree. 和LINQ to SQL進階系列(七)動態查詢一文中的方法類似。只是,它還包含了解析字符串部分.

從上面那個例子中,可以看出,LINQ to SQL在這種動態構造語句時,比拼接SQL麻煩很多。在LINQ to SQL進階系列(七)動態查詢一文中,筆者極力推薦使用object的查詢。這符合LINQ to SQL的設計原則。因為,它主要是為了解決data!=objects的問題而產生的.它所有的操作均針對object,那就讓我們使用object的查詢吧.

當然,依然會有人習慣拼接字符串.我并不認為這是個壞毛病。只是有點不符合oo思想而已。事實上,在LINQ to SQL中,你依然可以使用拼接字符串的形式,而不使用它提供的QueryExpression. 它提供了這么兩個接口,一個是,db.ExecuteQuery(string SQL);另一個是,db.ExecuteCommand(string SQL);這兩個函數都是直接接收 SQL語句的.習慣拼接的人,依然可以調用它們來實現你的程序。特別是第一個,其返回的就是一個對象的集合,多少還是有點oo思想的。

看下面的例子:

以下是引用片段:

var products = db.ExecuteQuery( 
"SELECT [Product List].ProductID, [Product List].ProductName " +
"FROM Products AS [Product List] " +
"WHERE [Product List].Discontinued = 0 " +
"ORDER BY [Product List].ProductName; "
).toList();

它返回的就是product的集合。而不是什么dataset和datatable之類的。這里,你可以大膽的使用該函數繼續拼接你的SQL吧,再看下面這個:

以下是引用片段:
db.ExecuteCommand("UPDATE Products SET UnitPrice = UnitPrice + 1.00");

它在做批處理的時候,你想不用它,都不行.當然,你如果覺得性能不是問題的話,那就用submitchange方法來做更新好了。簡單明了的說,LINQ to SQL在批處理更新的時候,SubmitChange只會一個個的更新。浪費時間資源.而這個接口,恰好滿足了批處理更新或刪除的問題。從這兩個例子,我們可以看出。沒有任何方案是萬能的。各有各的優點。

3、LINQ to SQL的性能

LINQ的性能已經被好多人提及.LINQ to Object的性能大家討論的比較多些.它確實比自己實現的查找要慢.但是當數據量特別大時,更多是時間是花在分配虛擬內存上了,那么他們的差別就不是那么明顯了。LINQ to SQL是又如何提升性能的?第一,采用延遲加載(deferredloading)技術。語句是聲明了,但是并不立即執行,而是在真正需要的時候才執行。第二,采用緩存技術。已經取到內存的數據,再依次提取時,會先從緩存中返回,而不是再次訪問數據庫。當然,筆者建議,不要對象的時候,沒有必要使用LINQ to SQL.比如,只是填充DataView或DataGrid時,返回dataset或datatable要比用LINQ to SQL實現的快很多。

結論:各種技術都有其自身的優點和缺點。使用什么樣的技術,完全在于項目對性能和開發進度的要求,以及程序員自身的愛好有關。揚長避短,才是正道。

【編輯推薦】

  1. 淺談LINQ如何插入刪除和更新數據庫記錄備注
  2. LINQ to SQL實現數據訪問通用基類
  3. 基于LINQ to SQL的WEB開發三層架構
責任編輯:彭凡 來源: 博客園
相關推薦

2009-09-07 22:54:03

Linq組合查詢

2009-09-18 15:19:19

LINQ to SQL

2009-09-15 10:02:44

Linq to SQL

2009-09-18 14:25:36

LINQ to SQL

2009-09-10 11:29:00

LINQ to SQL

2009-09-09 11:07:52

LINQ to SQL

2009-09-07 17:32:14

LINQ檢索數據

2009-09-16 11:15:52

Linq聯接數據

2009-05-08 10:15:04

LINQ插入刪除

2011-03-04 09:40:42

AJAX開發集成數據庫

2009-12-02 10:33:34

LINQ to SQL

2009-09-14 13:30:04

Linq數據和對象

2009-09-14 15:37:06

LINQ映射數據庫

2009-09-18 13:58:00

LINQ查詢數據庫

2009-04-10 09:22:48

SQL Server并發測試

2011-04-02 11:14:20

SQL Server數XML

2020-08-31 07:00:00

數據庫數據庫同步

2009-07-07 09:24:37

LINQ檢索

2009-09-15 16:31:15

LINQ Custom

2009-09-09 15:44:22

Linq DataCo
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩免费高清视频 | 欧美性网站 | 国产69久久精品成人看动漫 | caoporn视频在线 | 中文字幕在线观看国产 | 久草欧美视频 | 免费看淫片 | 91在线成人 | 日韩精品成人免费观看视频 | 久热免费在线 | 成人一区二区三区在线观看 | 日韩av高清| 九九热在线观看 | 色资源站 | 中文字幕一区二区三区不卡 | 综合五月 | 日韩精品视频在线免费观看 | 中文字幕一区二区三区不卡 | 久久免费视频在线 | 日韩中文久久 | 91pao对白在线播放 | 激情视频一区 | 日韩电影在线一区 | 中国一级特黄真人毛片 | 国产精品成人一区 | 亚洲精品第一页 | 久久久国产一区二区三区 | 日韩色在线 | 国产成人精品一区二区三区 | 欧美一区二区三区在线观看视频 | 日韩国产欧美在线观看 | 久久se精品一区精品二区 | 亚洲一区二区视频 | 日日夜夜免费精品 | 国产精品久久久爽爽爽麻豆色哟哟 | 国产视频久久久 | 欧美午夜一区 | 少妇一级淫片免费放播放 | 国产欧美一级 | 欧美成人精品激情在线观看 | 久久久天天 |