亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > 文庫 > 正文

淺談Linq To Sql集成數據庫語言的優劣

2024-09-07 22:12:16
字體:
來源:轉載
供稿:網友

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

(1)Linq To Sql的優點

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

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

在Linq To SQl 之前,在java領域有Hibernate,在net領域有NHibernate技術,來實現object/relational 持久和查詢服務。那和NHibernate比起來,它又有那些優勢呢.第一,影射代碼自動生成。VS2008提供了SqlMetal和OR Designer兩個工具來完成此步驟。而在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換成小寫的,一跑過了。莫非真的是列的名字?出個難題吧。找了一個列名,是帶空ge的,重新來建這個工程.一跑,錯了!把列名用中國擴號擴起來了,也是錯了???,只是動態構造Expression Tree而已,永遠都不能直接接收列的名字。這個例子看著是很簡單,可不知道你有沒有注意到它有一個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中,你依然可以使用拼接字符串的形式,而不使用它提供的Query Expression. 它提供了這么兩個接口,一個是,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是又如何提升性能的?第一,采用延遲加載(deferred loading)技術。語句是聲明了,但是并不立即執行,而是在真正需要的時候才執行。第二,采用緩存技術。已經取到內存的數據,再依次提取時,會先從緩存中返回,而不是再次訪問數據庫。當然,筆者建議,不要對象的時候,沒有必要使用Linq To Sql.比如,只是填充DataView或DataGrid時,返回dataset或datatable要比用Linq To Sql實現的快很多。

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品女厕一区二区三区| 国产亚洲精品va在线观看| 亚洲欧美国产高清va在线播| 91久久久久久久久久久久久| 欧美亚洲另类激情另类| 久久精品视频在线| 欧美视频在线免费| 亚洲第一精品夜夜躁人人爽| 在线视频日本亚洲性| 久久在线视频在线| 久久精品欧美视频| 欧美成人中文字幕| 久久影院资源站| 欧美最顶级的aⅴ艳星| 久热在线中文字幕色999舞| 亚洲天堂av高清| 欧美激情一区二区久久久| 亚洲摸下面视频| 日本19禁啪啪免费观看www| 久久亚洲影音av资源网| 色婷婷亚洲mv天堂mv在影片| 成人国产精品免费视频| 国产精品一区二区久久国产| 色哟哟亚洲精品一区二区| 国产香蕉97碰碰久久人人| 欧美激情视频一区| 日本精品久久久| 国产性猛交xxxx免费看久久| 欧美激情三级免费| 日韩视频欧美视频| 欧美日韩一区免费| 91成人在线视频| 97免费中文视频在线观看| 日韩av色综合| 国产aaa精品| 日韩激情第一页| 亚洲国产精品成人av| 国产精品久久久久av| 大胆欧美人体视频| 亚洲国产日韩欧美在线99| 国产美女精品免费电影| 久久综合久久美利坚合众国| 国产精品com| 久久久久久久久久国产精品| 亚洲精品午夜精品| 久久久久久久久久久91| 精品日本高清在线播放| 国产亚洲精品成人av久久ww| 中文字幕国产精品| 欧美一级电影久久| 欧美成人精品在线播放| 午夜欧美大片免费观看| 91日韩在线视频| 国产精品18久久久久久麻辣| 在线精品国产成人综合| 亚洲一区国产精品| 国产美女久久精品香蕉69| 麻豆乱码国产一区二区三区| 91av在线免费观看视频| 欧美激情一区二区久久久| 亚洲人在线视频| 亚洲精品网站在线播放gif| 欧美一级大片在线免费观看| 中文字幕亚洲第一| 中国日韩欧美久久久久久久久| 中文字幕日韩精品在线观看| 91美女片黄在线观| 国产精品中文在线| 欧美日韩国产精品| 成人av番号网| 日韩中文字幕精品| 色综合色综合久久综合频道88| 在线播放国产一区中文字幕剧情欧美| 国产精品第10页| 亚洲欧美日韩精品久久奇米色影视| 国产精品自拍偷拍| 国产精品久久网| 日韩精品黄色网| 亚洲色图校园春色| 亚洲视频在线观看网站| 国外视频精品毛片| 成人免费网站在线| 亚洲人成绝费网站色www| 欧美亚洲国产另类| 国产精品第一视频| 性欧美暴力猛交69hd| 国产精品成人观看视频国产奇米| 亚洲国产成人一区| 日韩精品视频免费在线观看| 国产精品视频在线播放| 色哟哟入口国产精品| 97久久超碰福利国产精品…| 欧美激情精品久久久久久免费印度| 日韩电视剧在线观看免费网站| 欧美黑人巨大xxx极品| 亚洲第一天堂无码专区| 91精品久久久久久| 日韩av一区在线观看| 国产一区二区三区在线播放免费观看| 91亚洲国产成人久久精品网站| 97视频在线观看亚洲| 日产精品99久久久久久| 亚洲香蕉在线观看| 欧美精品激情在线观看| 日韩在线观看免费全集电视剧网站| 亚洲激情小视频| 国产精品网站入口| 日韩有码在线观看| 在线成人激情视频| 国产精品igao视频| 色青青草原桃花久久综合| 精品呦交小u女在线| 日韩av在线网| 国产精品视频26uuu| 久久精品中文字幕电影| 夜夜嗨av色综合久久久综合网| 色伦专区97中文字幕| 深夜福利日韩在线看| 久久精品99国产精品酒店日本| 性欧美xxxx| 国产精品久久av| 亚洲人成77777在线观看网| 欧美一级黄色网| 91精品美女在线| 国产精品普通话| 亚洲视频电影图片偷拍一区| 97在线精品国自产拍中文| 91久久久久久久| 国产精品精品久久久| 色在人av网站天堂精品| 欧美人与性动交a欧美精品| 黄色一区二区在线观看| 91国偷自产一区二区三区的观看方式| 91精品国产综合久久香蕉| 亚洲一区二区中文| 97人洗澡人人免费公开视频碰碰碰| 国产精品www| 中文字幕精品视频| 欧美精品一区在线播放| 97国产成人精品视频| 欧美综合在线第二页| 国产精品久久久久7777婷婷| 色yeye香蕉凹凸一区二区av| 日韩av色综合| 国产女精品视频网站免费| 欧美一级bbbbb性bbbb喷潮片| 欧美日韩亚洲一区二区三区| 欧美大片在线影院| 欧美激情在线播放| 国内精品久久久久久久| 日韩精品视频在线观看网址| 欧美日本在线视频中文字字幕| 亚洲国产小视频在线观看| 国产精品91久久| 日韩成人在线免费观看| 亚洲人成在线观| 亚洲国内精品在线| 人人澡人人澡人人看欧美| 88xx成人精品| 亚洲国产高清自拍| 国产日本欧美一区二区三区| 中文字幕精品www乱入免费视频| 77777亚洲午夜久久多人| 国产精品欧美一区二区|