天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

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 == "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)

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

AspNet技術Linq to SQL Delete時遇到問題的解決方法,轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 麻豆AV久久无码精品九九 | 亚洲精品AV无码永久无码 | 国产精品日韩欧美一区二区三区 | 91久久偷偷做嫩草影院免费看 | 午夜向日葵高清在线观看 | 日韩午夜影院 | 色综合伊人色综合网站 | 男人大臿蕉香蕉大视频 | 亚洲成人免费在线 | 国产精品v欧美精品v日韩 | 色欲久久99精品久久久久久AV | 最近中文字幕2018MV高清在线 | 亚洲国产系列一区二区三区 | 国产偷抇久久精品A片蜜臀AV | 99精品视频免费在线观看 | 飘雪在线观看免费完整版 | 国精产品砖一区二区三区糖心 | 99精品国产第一福利网站 | 国产精品午夜小视频观看 | 国精品产露脸偷拍视频 | 99精品欧美一区二区三区美图 | 伊人久久综合热青草 | 久久久无码精品亚洲日韩按摩 | 最新国产精品视频免费看 | 秋霞伦理电影在2017韩国在线伦 | 色姐妹久久综合在线av | 强奷漂亮女老板在线播放 | 亚洲AV日韩AV欧美在线观看网 | 中国人泡妞xxxxxxxx19 | 国产亚洲欧美高清在线 | 95国产精品人妻无码久 | 亚洲精品久久久WWW游戏好玩 | 亚洲乱色视频在线观看 | 黑兽在线观看高清在线播放樱花 | 伊人精品在线 | 午夜精品国产自在现线拍 | xlxx美女| 国产在线精品亚洲视频在线 | 51成人精品午夜福利AV免费七 | 久久综合丁香激情久久 | 久久精品国产欧美 |