手机版

Linq to SQL Delete中遇到问题的解决方案

时间:2021-11-26 来源:互联网 编辑:宝哥软件园 浏览:

1.1、代码1: using(publisdatacontext publics content=new publisdatacontext()){ publics content。日志=控制台。出去;作者作者=pubsContent。作者:Single(a=a . au _ id==' 111-11-1111 ');公共内容。作者. DeleteOnSubmit(作者);公共内容。submit changes();}但是,我的程序在这里立即停止运行,第二行出现异常。image

为什么呢?看看MSDN对Signle方法的描述:image

哦,问题来了。单个需要且只有一行符合条件的记录,否则会引起大惊小怪。从前面的研究中,我知道DataContent在调用Single方法时会立即从数据库中获取数据库,但是如果此时没有获得auid='111-11-1111 '的记录,并且返回的记录集为空,则会引发上面的异常。1.2.我想找一个Linq直接删除的方法,而不是执行Select。搜了MSDN,翻了《LINQ in Action》,没有,后来想,既然Linq to sql有“延时加载”的功能,删除的时候能不能“延时”呢?我尝试了这个:代码2:使用(pubstadocentext pubs content=new pubstadocentext()){ var q=from a in pubs content。作者,其中a . au _ id=' 111-11。公共内容。日志=控制台。出去;公共内容。作者:DeleteAllunSubmit(q);公共内容。submit changes();}我的程序已经被驯服了,在这里我不会生气。Linq to sql真的像我想的那样执行au _ id=' 111-11-1111 '的作者的delete语句吗?2.1带着以上问题,逐步跟踪检查数据内容日志。我发现在使用Single()方法删除的时候,如果没有异常,提交的SQL语句是这样的。image_thumb_2

这里可以很清楚看出Linq先从数据库中取出记录,然后再删除。我们知道主键就可以确定表中唯一的记录了,可是为什么删除条件要把所有的列都加进去呢?老赵在这个帖子(在Linq to Sql中管理并发更新时的冲突[1],[2],[3] )里很详细的说明了这个问题。我的目的只是要删除一行记录,可是这样使用Linq to sql却先从数据库里取出来再删除,实在是多此一举。那代码2中的方法又是如何运行的呢?我们再来跟踪它。2.2为了更好的说明问题,我把代码一中的代码改一下,另外还在数据库中预先添加二行记录,au_id分别为111-11-1111、111-11-1112代码:使用(PubSDATOCENT PubSContext=new PubSDATOCENT()){ PubSContent .日志=控制台。出去;var q=来自公共内容中的一个。作者a.au_id .开始用(' 111-11-111 ')选择一个;公共内容。作者:DeleteAllunSubmit(q);公共内容提交更改();}把==条件换成了开始于(生成结构化查询语言语句时,从开始会生成比如"111-11-111%"匹配)。现在再下这段代码执行的Log:SELECT [t0].[au_id],[t0].[au_lname],[t0].[au_fname],[t0].[电话],[t0].[地址],[t0].[城市],[t0].[状态],[t0].[zip],[t0].[合同]FROM [dbo].[作者] AS [t0]WHERE [t0].[au _ id]LIKE @ P0-@ p 0: Input VarChar(Size=11;prec=0;scale=0)[111-11-111%]-context : SqL提供程序(SqL 2000)模型: AttributedMetaMoDEL build : 3。5 .21022 .8从[dbo]中删除.[作者]WHERE([au _ id]=@ P0)AND([au _ lname]=@ P1)AND([au _ fname]=@ p2)AND([phone]=@ P3)AND([address]=@ P4)AND([city]=@ P5)AND([state]=@ P6)AND([zip]=@ p7)AND([contract]=1)-@ p 0: Input VarChar(Size=11;prec=0;scale=0)[111-11-1111]-@ p 1: Input VarChar(Size=3;prec=0;scale=0)[qqq]-@ p 2: Input VarChar(Size=3;prec=0;scale=0)[qqq]-@ p :输入字符(大小=12;prec=0;scale=0)[qqq]-@ p 4: Input VarChar(Size=3;prec=0;scale=0)[qqq]-@ p 5: Input VarChar(Size=3;prec=0;Scale=0) [qqq] - @p6:输入字符(大小=2;prec=0;Scale=0) [qq] - @p7:输入Char(大小=5;prec=0;scale=0)[22222]-上下文: SqL提供程序(SqL 2000)模型: AttributedMetaMoDEL构建: 3。5 .21022 .8从[dbo]中删除.[作者]WHERE([au _ id]=@ P0)AND([au _ lname]=@ P1)AND([au _ fname]=@ p2)AND([phone]=@ P3)AND([address]=@ P4)AND([city]=@ P5)AND([state]=@ P6)AND([zip]=@ p7)AND([contract]=1)-@ p 0: Input VarChar(Size=11;prec=0;scale=0)[111-11-1112]-@ p 1: Input VarChar(Size=3;prec=0;scale=0)[qqq]-@ p 2: Input VarChar(Size=3;prec=0;scale=0)[qqq]-@ p :输入字符(大小=12;prec=0;scale=0)[qqq]-@ p 4: Input VarChar(Size=3;prec=0;scale=0)[qqq]-@ p 5: Input VarChar(Size=3;prec=0;Scale=0) [qqq] - @p6:输入字符(大小=2;prec=0;Scale=0) [qq] - @p7:输入Char(大小=5;prec=0;Scale=0) [22222]很失望,和我期待的结果不一样。在这个测试中,数据内容先把所有符合条件的记录全部取回来,再一个一个删除。如果要删除的有10000条记录的话,天都黑了.这点,不得不说Linq to sql有点笨了。3解决?只能绕个圈子了数据上下文。提供有执行推荐方法,可能使用此方法直接执行结构化查询语言命令。比如这样:代码4:正在使用(publisdatocentext publics content=new publisdatocentext()){ publics content .日志=控制台。出去;公共内容ExecuteCommand('从作者中删除,其中au_id类似' 111-11-111% ');}也可以通过数据上下文.关系取得当前的数据库连接,然后再通过推荐来提交自己的结构化查询语言语句,或者写个存储过程来负责删除4LINQ,语言级集成查询(语言集成查询)明显,强在查询,删除就弱弱点;-).

版权声明:Linq to SQL Delete中遇到问题的解决方案是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。