• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題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關鍵字專題關鍵字專題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
    當前位置: 首頁 - 科技 - 知識百科 - 正文

    Linq to SQL Delete時遇到問題的解決方法

    來源:懂視網 責編:小采 時間:2020-11-27 22:45:13
    文檔

    Linq to SQL Delete時遇到問題的解決方法

    Linq to SQL Delete時遇到問題的解決方法:1.1、 Code1: using (PubsDataContext pubsContent = new PubsDataContext()) { pubsContent.Log = Console.Out; Author author = pubsContent.Authors.Single(a => a.au_id ==
    推薦度:
    導讀Linq to SQL Delete時遇到問題的解決方法: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();
    }

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

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

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

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

    把==條件換成了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]
    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]

    很失望,和我期待的結果不一樣。

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

    如果要刪除的有10000條記錄的話,天都黑了...

    這點,不得不說Linq to sql有點笨了。

    3

    解決?

    只能繞個圈子了。

    DataContext提供有ExecuteCommend方法,可能使用此方法直接執行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取得當前的數據庫連接,然后再通過DBCommend來提交自己的SQL語句,

    或者寫個存儲過程來負責刪除。

    4

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

    明顯,強在查詢,刪除就弱弱點 ;-)...

    聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    Linq to SQL Delete時遇到問題的解決方法

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

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 国精品无码一区二区三区左线| 97国产视频精品| 亚洲欧美精品伊人久久| 尤物国精品午夜福利视频| 国产精品va在线观看无码| 国产精品多p对白交换绿帽| 亚洲精品视频在线看| 国产99视频精品免费视频76| 国产欧美日韩综合精品一区二区| 日韩一区二区三区在线精品| 国产乱码伦精品一区二区三区麻豆| 久久精品国产半推半就| 国产日产韩国精品视频| 亚洲AV无码成人精品区在线观看| 老司机午夜网站国内精品久久久久久久久| 久久综合九色综合精品| 91麻豆精品视频在线观看| 国产欧美日韩精品a在线观看 | 精品亚洲A∨无码一区二区三区| 欧美久久久久久午夜精品| 精品国产日韩亚洲一区| 99久久国产综合精品成人影院| 久久久久夜夜夜精品国产| 好属妞这里只有精品久久| 国产精品成人va在线观看| 99久久精品毛片免费播放| 91精品国产乱码久久久久久| 成人区精品一区二区不卡| 国产精品免费一区二区三区四区| 精品国产福利一区二区| 国产亚洲精品岁国产微拍精品 | 在线中文字幕精品第5页| 亚洲欧美日韩精品久久亚洲区 | 无码日韩精品一区二区免费| 午夜精品久久久久久久| 久久精品国产第一区二区三区| 精品人无码一区二区三区| 99在线精品视频在线观看| laowang在线精品视频| 欧美精品国产精品| 成人免费精品网站在线观看影片 |