发现了什么?首先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();
Linq会怎么做呢?和上面一样!取出所有字段,把View加一,用所有字段做为条件(包括Views),更新回去。
设想一下,这样一个被频繁使用的计数器,两次操作出现SELECT与UPDATE交叉情况的可能性很大,那么后者还能更新成功么?
微软就是这样解释的,如果在你更新过程中,有其他人更新了这一行,那么这一行也就不是你所需要的那一行了,为了防止这样的冲突,所以把所有字段都放在WHERE语句中,这是by design的。
你可以通过其他方法进行更新数据,然而在目前版本,这个方法也表现的不怎么样。
System.Data.Linq.Table<T>有一个Attach方法,带有三个重载,用来直接更新数据的,我们来一个一个的来看看。
Attach(T entity) 1var ctx = new MyDataContext(); 2var newUser = new User(); 3newUser.UserId = new Guid("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx");//假设作为参数传进来的 4newUser.UserName = "New User Name"; 5ctx.Users.Attach(newUser); 6ctx.SubmitChanges();
(编辑:aniston)
|