用 .NET 兩年了,也積累一些知識與經驗,覺得應該做出點自己的東西,而不只是給別人打工。決定利用最新發布的 VS2008 (Orcas) Beta2 加入 Web 2.0 大潮,一來學以致用,二來在實踐中掌握最新技術。
專案代號定為 Pluto,紀念不久前被剝奪九大行星資格的天蠍座守護星——冥王星。平時有工作,只能利用業餘時間開發,預計 (爭取) 在 VS2008 正式發布時 Pluto 也能完成。這裡記錄開發 Pluto 過程中的一些事。
Web 2.0 網站少不了資料庫、資料存取,也是一切操作之本,而 VS2008 最大亮點之一 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();