中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Linq更新數據實用嗎

發布時間:2021-12-02 09:25:32 來源:億速云 閱讀:205 作者:iii 欄目:編程語言

本篇內容主要講解“Linq更新數據實用嗎”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Linq更新數據實用嗎”吧!

WEB 2.0的網站少不了數據庫、數據訪問,也是一切操作之本,而VS 2008中***的亮點之一Linq也恰巧是做這個的,所以我的開發從Linq、從數據庫開始。網上關于Linq的教學鋪天蓋地,我不準備重復,我只寫下我遇到的問題。Linq更新數據怎么就那么費勁?

Linq的全稱是Language Integrated Query ,也就是說Linq是以一個查詢語言的方式出現在我們面前的。在查詢方面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, CreatTime 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();

Linq更新數據會怎么做呢?和上面一樣!取出所有字段,把View加一,用所有字段做為條件(包括Views),更新回去。

設想一下,這樣一個被頻繁使用的計數器,兩次操作出現SELECT與UPDATE交叉情況的可能性很大,那么后者還能更新成功么?

微軟就是這樣解釋的,如果在你Linq更新數據中,有其他人更新了這一行,那么這一行也就不是你所需要的那一行了,為了防止這樣的沖突,所以把所有字段都放在WHERE語句中,這是by design的。

你可以通過其他方法進行更新數據,然而在目前版本,這個方法也表現的不怎么樣。

System.Data.Linq.Table有一個Attach方法,帶有三個重載,用來直接更新數據的,我們來一個一個的來看看。

Attach(T entity)  var ctx = new MyDataContext();  var newUser = new User();  newUser.UserId = new Guid("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx");//假設作為參數傳進來的  newUser.UserName = "New User Name";  ctx.Users.Attach(newUser);  ctx.SubmitChanges();   //結束

運行完全沒有任何效果,SQL Profiler無任何記錄。

Attach(T entity, T original)  var ctx = new MyDataContext();  var newUser = new User();  newUser.UserId = new Guid("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx");//假設作為參數傳進來的  newUser.UserName = "New User Name";  var user = ctx.User.Where(u => u.UserId = newUser.UserId).Single();  ctx.Users.Attach(newUser, user);  ctx.SubmitChanges();    //結束

運行時提示: Cannot add an entity with a key that is already in use.

Attch(T entity, bool asmodified)  var ctx = new MyDataContext();  var newUser = new User();  newUser.UserId = new Guid("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx");//假設作為參數傳進來的  newUser.UserName = "New User Name";  ctx.Users.Attach(newUser, true);  ctx.SubmitChanges();    //結束

運行時提示:An entity can only be attached as modified without original state if it declares a version member or does not have an update check policy.

怎么辦?提示中說"declares a version member ",通常來說是指SQL SERVER中TimeStamp類型的字段,在你所需要更新的表中加上一個字段,并標記為TimeStamp就可以了。但是這樣做,對于我們來說仍然是個浪費,并且WHERE語句中仍然會出現TimeStamp的限制。

你還可以通過在字段上設置UpdateCheck.Never屬性來避免更新檢查,但是如果數據表更新、新增存儲過程,需要重新生成dbml的話,你需要手動重新設置一遍。

Linq更新數據甚至沒有一個類似Web引用中Update Web Reference的操作來讓你方便的在數據表更新后更新dbml,并且在這個版本都不會提供,你所能做的只有刪除原來的表,刷新Server Exploer,重新拖拽到dbml的設計視圖中,或者,寫個腳本,讓SQLMETAL來幫你完成這些。

到此,相信大家對“Linq更新數據實用嗎”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

浠水县| 柞水县| 神木县| 美姑县| 固镇县| 沧州市| 准格尔旗| 泰和县| 安乡县| 右玉县| 苏尼特右旗| 二连浩特市| 忻城县| 临泉县| 金川县| 宣汉县| 贡山| 遵义市| 泾阳县| 辉南县| 敦煌市| 旬阳县| 卢龙县| 邳州市| 隆昌县| 无极县| 瓦房店市| 黎平县| 莱州市| 阿克| 清水县| 辽源市| 西宁市| 高阳县| 额济纳旗| 五大连池市| 庆云县| 溆浦县| 商河县| 临高县| 汝州市|