程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> VS2008的Linq更新數據就那麼費勁?(1)

VS2008的Linq更新數據就那麼費勁?(1)

編輯:關於C語言

用.Net兩年了,也積累了一些知識和經驗,覺得應該做出點自己的東西,而並不只是給別人打工。

所以決定利用最新發布的VS2008(Orcas) Beta2也加入到WEB 2.0的大潮中來,一來是學以所用,二來在實踐中掌握最新的技術。

現在流行在開發階段給項目起個Code Name,我也來湊湊熱鬧,就叫Pluto,以紀念不久前被剝奪九大行星資格的我們天蠍座的守護星——冥王星

平時有自己的工作,只能利用不多的業余時間開發,所以預計(爭取)在VS2008正式發布之際,Pluto也能開發完成。

在這裡,我會記錄下開發Pluto中的一些事情。

WEB 2.0的網站少不了數據庫、數據訪問,也是一切操作之本,而VS 2008中最大的亮點之一Linq也恰巧是做這個的,所以我的開發從Linq、從數據庫開始。網上關於Linq的教學鋪天蓋地,我不准備重復,我只寫下我遇到的問題。

Linq,更新數據怎麼就那麼費勁?

Linq的全稱是Language Integrated Query ,也就是說Linq是以一個查詢語言的方式出現在我們面前的。在查詢方面Linq做了不少的優化,我們不用在費盡心思去拼裝SQL語句、組裝實體等,所有操作在Linq裡都是強類型的,我們用C#代碼輕松地寫出漂亮的SQL語句。

那麼做為一個查詢語言,Linq在數據更新方面又是怎麼表現的呢?通常來說Linq的更新會以以下的方式出現(絕大部分教程中都是這麼寫的)

1var ctx = new MyDataContext();
2var user = ctx.Users.Where(u => u.UserId == userId).Single();
3user.UserName = "New User Name";
4ctx.SubmitChanges();

這些是C#代碼,但是背後做了什麼呢?Linq會為我們生成類似一下的SQL語句

1--第一步,查詢
2SELECT UserId, UserName, FirstName, LastName, CreatTime From User WHERE UserId = @userId
3
4--第二部,更新
5UPDATE User SET UserName = @newUserName
6WHERE UserId = @oldUserId, userName = @oldUserName, FirstName = @oldFirstName, LastName = @oldLastName

發現了什麼?首先Linq會取出所有的字段,在user.UserName = "New User Name"的時候,記錄下UserName字段被更新過了,UPDATE時會只更新UserName,但是把之前所有字段的值放在WHERE語句裡來做為條件。

Are you kidding?! 這樣的效率實在是太差了吧?!

拋開效率問題,接下來我們看另外一種更新,有個某個字段記錄頁面被訪問的次數,平時我們會用

1UPDATE POST SET Views = VIEws + 1 WHERE PostId = @PostId

但是如果我們寫下如下C#代碼

1var ctx = MyDataContext();
2var post = ctx.Posts.Where(p => p.PostId = @postId).Single();
3post.VIEws++
4ctx.SubmitChanges();

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved