我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Linq更新数据实用吗

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Linq更新数据实用吗

本篇内容主要讲解“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更新数据实用吗”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Linq更新数据实用吗

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Linq更新数据实用吗

本篇内容主要讲解“Linq更新数据实用吗”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Linq更新数据实用吗”吧!WEB 2.0的网站少不了数据库、数据访问,也是一切操作之本,而VS 2008中
2023-06-17

LINQ to SQL数据库如何更改

这篇文章主要介绍“LINQ to SQL数据库如何更改”,在日常操作中,相信很多人在LINQ to SQL数据库如何更改问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”LINQ to SQL数据库如何更改”的疑
2023-06-17

Windows update更新有用吗?有必要进行更新吗?

不少电脑爱好者在讨论Windows update更新有用吗?对于这个问题,其实在网上很多论坛也有激烈讨论。其实我们讨论Windows update更新主要是针对其对我们电脑系统的影响以及用户体验方面。那么Windows update更新是否
2023-05-31

使用javascript怎么实现页面无刷新更新数据

这篇文章给大家介绍使用javascript怎么实现页面无刷新更新数据,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。 1.首先在服务器上建立一个CheckUser.asp文件,用来检测用户是否存在,根据用户是否存在分别反
2023-06-10

如何使用@CachePut更新数据库和更新缓存

小编给大家分享一下如何使用@CachePut更新数据库和更新缓存,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!关于更新缓存 ,要注意两点1、@Cacheable的
2023-06-22

layui table如何结合WebSocket实现实时数据更新?(通过WebSocket实现layui table实时数据更新)

layuiTable可与WebSocket结合实现实时数据更新。WebSocket建立全双工通信通道,服务器主动推送数据至客户端。layuiTable绑定WebSocket数据,并根据服务器更新增量或全部更新表格数据。这种方式减少服务器请求,提升性能,为用户带来及时的数据更新体验。
layui table如何结合WebSocket实现实时数据更新?(通过WebSocket实现layui table实时数据更新)
2024-04-02

Linq如何使用数据表

这篇文章主要为大家展示了“Linq如何使用数据表”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Linq如何使用数据表”这篇文章吧。首先让大家了解下Linq使用数据表,然后全面介绍生成的SQL语句
2023-06-17

jquery php如何实现实时数据更新

jquery php实现实时数据更新的方法:1、创建数据表;2、通过创建服务器文件“demo.php”连接数据库并进行相关操作;3、创建显示数据的“fresh.html”网页即可。
2019-01-12

jquery php怎么实现实时数据更新

本篇文章给大家分享的是有关jquery php怎么实现实时数据更新,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。本文操作环境:Windows7系统、PHP7.1版、Dell G
2023-06-22

oracle怎么更新数据返回最新数据

要更新数据并返回最新数据,可以使用以下步骤:首先,使用UPDATE语句更新数据库中的数据。例如,更新一个名为"table_name"的表中的一行数据:UPDATE table_nameSET column1 = 'new_val
oracle怎么更新数据返回最新数据
2024-04-09

mongodb批量更新数据怎么实现

在 MongoDB 中,可以使用 updateMany() 方法来批量更新数据。下面是一个示例:假设有一个名为 users 的集合,其中包含了多个文档。要批量更新这些文档,可以使用以下代码:// 连接数据库const MongoCli
mongodb批量更新数据怎么实现
2024-04-09

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录