你好,欢迎来到电脑编程技巧与维护杂志社! 杂志社简介广告服务读者反馈编程社区  
合订本订阅
 
 
您的位置:技术专栏 / Linux开发
VS2008的Linq,更新数据就那么费劲?(2)
 
发现了什么?首先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)

  推荐精品文章

·2024年12月目录 
·2024年11月目录 
·2024年10月目录 
·2024年9月目录 
·2024年8月目录 
·2024年7月目录 
·2024年6月目录 
·2024年5月目录 
·2024年4月目录 
·2024年3月目录 
·2024年2月目录 
·2024年1月目录
·2023年12月目录
·2023年11月目录

  联系方式
TEL:010-82561037
Fax: 010-82561614
QQ: 100164630
Mail:gaojian@comprg.com.cn

  友情链接
 
Copyright 2001-2010, www.comprg.com.cn, All Rights Reserved
京ICP备14022230号-1,电话/传真:010-82561037 82561614 ,Mail:gaojian@comprg.com.cn
地址:北京市海淀区远大路20号宝蓝大厦E座704,邮编:100089