• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >ASP.NET > Linq to SQL Delete时遇到问题的解决方法

Linq to SQL Delete时遇到问题的解决方法

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-11

通过本文主要向大家介绍了linq delete,linq to sql,linq to sql教程,linq to sql查询,c linq to sql等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

1.1、

 

Code1:
using (PubsDataContext pubsContent = new PubsDataContext())
{
    pubsContent.Log = Console.Out;
    Author author = pubsContent.Authors.Single(a => a.au_id == "111-11-1111");
    pubsContent.Authors.DeleteOnSubmit(author);
    pubsContent.SubmitChanges();
}
</div></div>

可是,马上我的程序支持到这里就跑不动了,第二行有异常。

image

为什么呢?

看一下MSDN关于Signle方法的说明:

image

哦,问题出在这里,Single要求符合条件的记录有且只有一行,否则就会发飙。

从以前的学习中我知道,调用Single方法时DataContent即刻从数据库中获取数据库,而这个时间如果获取不到auid="111-11-1111"的记录,返回的记录集是空的,就引发了上面的异常。

1.2、

我想找一个方法,让Linq不执行Select而直接Delete,搜完了MSDN,翻完了《LINQ in Action》,没有。

后来我想,既然Linq to sql有“延迟加载”功能,那么删除时能不能也“延迟”呢,我尝试这样:

Code 2:
using (PubsDataContext pubsContent = new PubsDataContext())
{
    var q = from a in pubsContent.Authors
            where a.au_id == "111-11-1111"
            select a;
    pubsContent.Log = Console.Out;
    pubsContent.Authors.DeleteAllOnSubmit(q);
    pubsContent.SubmitChanges();
}
</div></div>

我的程序被驯服了,不在这里发飙了。

难道Linq to sql真如我所想的直接执行delete from Authors where au_id='111-11-1111'这样的语句了吗?

2.1

带着上面的疑问,一步一步跟踪查看DataContent的Log。我发现,在用Single()方法来删除的时候,如果不出现异常,提交的SQL语句是这样的。

image_thumb_2

这里可以很清楚看出,Linq先从数据库中取出记录,然后再Delete。我们知道主键就可以确定表中唯一的记录了,可是为什么删除条件要把所有的列都加进去呢?老赵在这个post(在Linq to Sql中管理并发更新时的冲突[1],[2],[3] )里很详细的说明了这个问题。

我的目的只是要删除一行记录,可是这样使用Linq to sql却先从数据库里取出来再删除,实在是多此一举。那Code 2中的方法又是如何运行的呢?我们再来跟踪它。

2.2

为了更好的说明问题,我把Code 1中的代码改一下,另外还在数据库中预先添加二行记录,au_id分别为111-11-1111、111-11-1112

Code 3:
using (PubsDataContext pubsContent = new PubsDataContext())
{
    pubsContent.Log = Console.Out;
    var q = from a in pubsContent.Authors
            where a.au_id.StartsWith("111-11-111")
            select a;
    pubsContent.Authors.DeleteAllOnSubmit(q);
    pubsContent.SubmitChanges();
}
</div></div>

把==条件换成了StartsWith(生成SQL语句时,StartWith会生成Like '111-11-111%'匹配)。

现在再下这段代码执行的Log:

SELECT [t0].[au_id], [t0].[au_lname], [t0].[au_fname], [t0].[phone],
[t0].[address], [t0].[city], [t0].[state], [t0].[zip], [t0].[contract]
FROM [dbo].[authors] AS [t0]
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • Linq to SQL Delete时遇到问题的解决方法

相关文章

  • 2017-05-11ASP.NET访问共享文件夹的详细步骤
  • 2017-05-11IsPostBack原理的介绍
  • 2017-05-11一步一步asp.net ajax类别Tree生成
  • 2017-05-11asp.net中使用repeater和PageDataSource搭配实现分页代码
  • 2017-05-11ASP.NET对大文件上传的解决方案
  • 2017-05-11解析WPF绑定层次结构数据的应用详解
  • 2017-05-11asp.net 动态创建TextBox控件及状态数据如何加载
  • 2017-05-11ASP.NET中 TextBox 文本输入框控件的使用方法
  • 2017-05-11.net搜索查询并实现分页实例
  • 2017-05-11Asp.Net二级域名共享Forms身份验证、下载站/图片站的授权访问控制

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • asp.net AutoCompleteExtender的一个简单例子代码
    • ASP.NET 根据汉字获取汉字拼音的首字母(含多音字)
    • Asp.net中将Word文件转换成HTML的方法
    • asp.net网络数据库开发实例精解 源文件
    • asp.net下按钮点击后禁用的实现代码
    • asp.net下Response.ContentType类型汇总
    • 用.NET如何生成二维码
    • php 三级联动菜单
    • .NET工厂方法模式讲解
    • Discuz!nt 源文件变成乱码的解决方法

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有