欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
Linq to SQL: Delete時(shí)遇到的問(wèn)題

Linq to SQL: Delete時(shí)遇到的問(wèn)題

2008-02-21 22:58 by 無(wú)常, 3439 閱讀, 9 評論, 收藏, 編輯

1.1、

在Linq to SQL中要刪除一行記錄,官方的例子教我這樣做

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)了,第二行有異常。

為什么呢?

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

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

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

1.2、

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

后來(lái)我想,既然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真如我所想的直接執行delete from Authors where au_id='111-11-1111'這樣的語(yǔ)句了嗎?

2.1

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

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

我的目的只是要刪除一行記錄,可是這樣使用Linq to sql卻先從數據庫里取出來(lái)再刪除,實(shí)在是多此一舉。那Code 2中的方法又是如何運行的呢?我們再來(lái)跟蹤它。

2.2

為了更好的說(shuō)明問(wèn)題,我把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語(yǔ)句時(shí),StartWith會(huì )生成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]

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

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

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

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

3

解決?

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

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%'");
}

也可以通過(guò)DataContext.Connection取得當前的數據庫連接,然后再通過(guò)DBCommend來(lái)提交自己的SQL語(yǔ)句,

或者寫(xiě)個(gè)存儲過(guò)程來(lái)負責刪除。

4

LINQ,語(yǔ)言級集成查詢(xún)(Language INtegrated Query)

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

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
Linq To Sql進(jìn)階系列(三)CUD和Log
LINQ to SQL 系列 如何使用LINQ to SQL插入、修改、刪除數據
一步一步學(xué)Linq to sql(五):存儲過(guò)程
分頁(yè)存儲過(guò)程-號稱(chēng)最完整
一步一步學(xué)Linq to sql(四):查詢(xún)句法 - LoveCherry - 博客園
初學(xué)者應該怎樣學(xué)習 Linq to SQL 框架 - Neil Chen - 博客園
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久