<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當(dāng)前位置: 首頁 - 科技 - 知識(shí)百科 - 正文

        Linq to SQL Delete時(shí)遇到問題的解決方法

        來源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-27 22:45:13
        文檔

        Linq to SQL Delete時(shí)遇到問題的解決方法

        Linq to SQL Delete時(shí)遇到問題的解決方法:1.1、 Code1: using (PubsDataContext pubsContent = new PubsDataContext()) { pubsContent.Log = Console.Out; Author author = pubsContent.Authors.Single(a => a.au_id ==
        推薦度:
        導(dǎo)讀Linq to SQL Delete時(shí)遇到問題的解決方法:1.1、 Code1: using (PubsDataContext pubsContent = new PubsDataContext()) { pubsContent.Log = Console.Out; Author author = pubsContent.Authors.Single(a => a.au_id ==

        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();
        }

        可是,馬上我的程序支持到這里就跑不動(dòng)了,第二行有異常。

        image

        為什么呢?

        看一下MSDN關(guān)于Signle方法的說明:

        image

        哦,問題出在這里,Single要求符合條件的記錄有且只有一行,否則就會(huì)發(fā)飆。

        從以前的學(xué)習(xí)中我知道,調(diào)用Single方法時(shí)DataContent即刻從數(shù)據(jù)庫中獲取數(shù)據(jù)庫,而這個(gè)時(shí)間如果獲取不到auid="111-11-1111"的記錄,返回的記錄集是空的,就引發(fā)了上面的異常。

        1.2、

        我想找一個(gè)方法,讓Linq不執(zhí)行Select而直接Delete,搜完了MSDN,翻完了《LINQ in Action》,沒有。

        后來我想,既然Linq to sql有“延遲加載”功能,那么刪除時(shí)能不能也“延遲”呢,我嘗試這樣:

        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();
        }

        我的程序被馴服了,不在這里發(fā)飆了。

        難道Linq to sql真如我所想的直接執(zhí)行delete from Authors where au_id='111-11-1111'這樣的語句了嗎?

        2.1

        帶著上面的疑問,一步一步跟蹤查看DataContent的Log。我發(fā)現(xiàn),在用Single()方法來刪除的時(shí)候,如果不出現(xiàn)異常,提交的SQL語句是這樣的。

        image_thumb_2

        這里可以很清楚看出,Linq先從數(shù)據(jù)庫中取出記錄,然后再Delete。我們知道主鍵就可以確定表中唯一的記錄了,可是為什么刪除條件要把所有的列都加進(jìn)去呢?老趙在這個(gè)post(在Linq to Sql中管理并發(fā)更新時(shí)的沖突[1],[2],[3] )里很詳細(xì)的說明了這個(gè)問題。

        我的目的只是要?jiǎng)h除一行記錄,可是這樣使用Linq to sql卻先從數(shù)據(jù)庫里取出來再刪除,實(shí)在是多此一舉。那Code 2中的方法又是如何運(yùn)行的呢?我們?cè)賮砀櫵?/P>

        2.2

        為了更好的說明問題,我把Code 1中的代碼改一下,另外還在數(shù)據(jù)庫中預(yù)先添加二行記錄,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();
        }

        把==條件換成了StartsWith(生成SQL語句時(shí),StartWith會(huì)生成Like '111-11-111%'匹配)。

        現(xiàn)在再下這段代碼執(zhí)行的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]
        WHERE [t0].[au_id] LIKE @p0
        -- @p0: Input VarChar (Size = 11; Prec = 0; Scale = 0) [111-11-111%]
        -- Context: SqlProvider(Sql2000) Model: AttributedMetaModel Build: 3.5.21022.8
         
        DELETE FROM [dbo].[authors] 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)
        -- @p0: Input VarChar (Size = 11; Prec = 0; Scale = 0) [111-11-1111]
        -- @p1: Input VarChar (Size = 3; Prec = 0; Scale = 0) [qqq]
        -- @p2: Input VarChar (Size = 3; Prec = 0; Scale = 0) [qqq]
        -- @p3: Input Char (Size = 12; Prec = 0; Scale = 0) [qqq         ]
        -- @p4: Input VarChar (Size = 3; Prec = 0; Scale = 0) [qqq]
        -- @p5: Input VarChar (Size = 3; Prec = 0; Scale = 0) [qqq]
        -- @p6: Input Char (Size = 2; Prec = 0; Scale = 0) [qq]
        -- @p7: Input Char (Size = 5; Prec = 0; Scale = 0) [22222]
        -- Context: SqlProvider(Sql2000) Model: AttributedMetaModel Build: 3.5.21022.8
         
        DELETE FROM [dbo].[authors] 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)
        -- @p0: Input VarChar (Size = 11; Prec = 0; Scale = 0) [111-11-1112]
        -- @p1: Input VarChar (Size = 3; Prec = 0; Scale = 0) [qqq]
        -- @p2: Input VarChar (Size = 3; Prec = 0; Scale = 0) [qqq]
        -- @p3: Input Char (Size = 12; Prec = 0; Scale = 0) [qqq         ]
        -- @p4: Input VarChar (Size = 3; Prec = 0; Scale = 0) [qqq]
        -- @p5: Input VarChar (Size = 3; Prec = 0; Scale = 0) [qqq]
        -- @p6: Input Char (Size = 2; Prec = 0; Scale = 0) [qq]
        -- @p7: Input Char (Size = 5; Prec = 0; Scale = 0) [22222]

        很失望,和我期待的結(jié)果不一樣。

        在這個(gè)測試中,DataContent先把所有符合條件的記錄全部取回來,再一個(gè)一個(gè)Delete。

        如果要?jiǎng)h除的有10000條記錄的話,天都黑了...

        這點(diǎn),不得不說Linq to sql有點(diǎn)笨了。

        3

        解決?

        只能繞個(gè)圈子了。

        DataContext提供有ExecuteCommend方法,可能使用此方法直接執(zhí)行SQL命令。比如這樣:

        Code 4:
        using (PubsDataContext pubsContent = new PubsDataContext())
        {
            pubsContent.Log = Console.Out;
            pubsContent.ExecuteCommand("delete from Authors where au_id like '111-11-111%'");
        }

        也可以通過DataContext.Connection取得當(dāng)前的數(shù)據(jù)庫連接,然后再通過DBCommend來提交自己的SQL語句,

        或者寫個(gè)存儲(chǔ)過程來負(fù)責(zé)刪除。

        4

        LINQ,語言級(jí)集成查詢(Language INtegrated Query)

        明顯,強(qiáng)在查詢,刪除就弱弱點(diǎn) ;-)...

        聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        Linq to SQL Delete時(shí)遇到問題的解決方法

        Linq to SQL Delete時(shí)遇到問題的解決方法:1.1、 Code1: using (PubsDataContext pubsContent = new PubsDataContext()) { pubsContent.Log = Console.Out; Author author = pubsContent.Authors.Single(a => a.au_id ==
        推薦度:
        標(biāo)簽: 解決辦法 解決 問題
        • 熱門焦點(diǎn)

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 久久亚洲AV成人无码国产| 国产亚洲一区二区手机在线观看| 久久久久免费视频| 又黄又大又爽免费视频| 亚洲熟女综合色一区二区三区| 国产精品亚洲专区在线播放| 永久黄网站色视频免费直播| 国产精品亚洲专区无码牛牛| 成人免费无码大片a毛片软件| 精品亚洲成α人无码成α在线观看| 久久精品国产69国产精品亚洲| 亚洲一级毛片视频| 好吊妞998视频免费观看在线| 中文字幕在线亚洲精品 | 成人特级毛片69免费观看| 日本无卡码免费一区二区三区| 亚洲av永久无码精品国产精品 | 亚洲AV男人的天堂在线观看| 精品国产麻豆免费网站| 国产成人亚洲综合在线| 国产综合亚洲专区在线| 99久久精品免费视频| 亚洲欧洲精品久久| 女性无套免费网站在线看| 一级毛片免费播放视频| 亚洲av色福利天堂| 免费黄色一级毛片| 精品国产污污免费网站入口在线| 免费视频中文字幕| 国产久爱免费精品视频| 亚洲综合无码一区二区三区| 日韩黄色免费观看| 成人精品视频99在线观看免费| 亚洲av手机在线观看| 亚欧免费一级毛片| 亚洲av永久无码一区二区三区| 69式互添免费视频| 窝窝影视午夜看片免费| 亚洲男人的天堂在线播放| 国产成人精品免费视频大全五级| 亚洲 日韩经典 中文字幕 |