首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

VS2008 LINQ 更新資料真的那麼麻煩?(一):預設更新機制效能分析

     編輯:關於C語言

用 .NET 兩年了,也積累一些知識與經驗,覺得應該做出點自己的東西,而不只是給別人打工。決定利用最新發布的 VS2008 (Orcas) Beta2 加入 Web 2.0 大潮,一來學以致用,二來在實踐中掌握最新技術。

專案代號定為 Pluto,紀念不久前被剝奪九大行星資格的天蠍座守護星——冥王星。平時有工作,只能利用業餘時間開發,預計 (爭取) 在 VS2008 正式發布時 Pluto 也能完成。這裡記錄開發 Pluto 過程中的一些事。

Web 2.0 網站少不了資料庫、資料存取,也是一切操作之本,而 VS2008 最大亮點之一 LINQ 恰巧做這個,所以開發從 LINQ、從資料庫開始。網上關於 LINQ 教學鋪天蓋地,我不重複,只寫下遇到的問題。

LINQ,更新資料怎麼就那麼費勁?

LINQ 全稱 Language Integrated Query,以查詢語言方式呈現。查詢方面 LINQ 做了不少優化,我們不用費心拼湊 SQL、組裝實體,所有操作在 LINQ 裡都是強型別,用 C# 代碼輕松寫出漂亮 SQL。

那麼作為查詢語言,LINQ 在資料更新方面表現如何?通常 LINQ 更新以以下方式出現 (絕大部分教程皆如此):

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

這些是 C# 代碼,但背後做了什麼?LINQ 會為我們生成類似以下 SQL:

-- 第一步,查詢
SELECT UserId, UserName, FirstName, LastName, CreateTime From User WHERE UserId = @userId
-- 第二步,更新
UPDATE User SET UserName = @newUserName
WHERE UserId = @oldUserId, UserName = @oldUserName, FirstName = @oldFirstName, LastName = @oldLastName

發現什麼?LINQ 會取出所有欄位,在 user.UserName = "New User Name" 時記錄 UserName 被更新,UPDATE 時只更新 UserName,但把之前所有欄位值放在 WHERE 子句作條件。

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

拋開效率問題,看另一種更新:某欄位記錄頁面瀏覽次數,平時我們用:

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

但若寫 C# 代碼:

var ctx = MyDataContext();
var post = ctx.Posts.Where(p => p.PostId == postId).Single();
post.Views++;
ctx.SubmitChanges();
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved