[英]How do I delete a row with a null foreign key using Linq-to-SQL?
我有一個名為tblOvrdImpVolsType
的表, tblOvrdImpVolsType
包含兩個可以為空的外鍵列。 當此行中的一個外鍵列為空時,我在使用Linq-To-SQL刪除此表中的行時遇到問題。 這是我的代碼:
using (Databases.Global db = new Databases.Global())
{
db.Log = Console.Out;
var records = from iv in db.tblOvrdImpVolsType
join sm in db.tblSecurityMasterType
on iv.FkSecurity equals sm.PkSecurity
where sm.Name == name
select iv; //returns only 1 record
db.tblOvrdImpVolsType.DeleteAllOnSubmit<MyTableType>(records);
int numDeletes = db.GetChangeSet().Deletes.Count; // = 1
db.SubmitChanges(); //deletes 0 records
}
Databases.Global繼承自DataContext並具有我使用的表。
tblOvrdImpVolsType有兩個可以為空的外鍵列(key1和key2)
我感興趣的行有這些鍵值(key1 = 9898,key2 = null)
在我的C#代碼中,key1和key2的數據類型都是int?
和CanBeNull = true
GetChangeSet()
顯示將刪除一條記錄,但是當我檢查數據庫時,該行顯然不會被刪除。
沒有異常被拋出。
這是DataContext生成的SQL:
DELETE FROM [tblOvrdImpVols] WHERE ([key1] = @p0) AND ([key2] = @p1)
-- @p0: Input Int (Size = -1; Prec = 0; Scale = 0) [9898]
-- @p1: Input Int (Size = -1; Prec = 0; Scale = 0) [Null]
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 4.0.30319.17929
我認為問題是[key2] = @p1
部分。 因為我感興趣的key2值為null,所以SQL很糟糕。 下面的這些SQL查詢說明了這一點 唯一的區別是key2
條件中的is
vs. =
:
select * FROM [tblOvrdImpVols] WHERE ([key1] = 9898) AND ([key2] is null)
--returns 1 row
select * FROM [tblOvrdImpVols] WHERE ([key1] = 9898) AND ([key2] = null)
--returns 0 rows
我究竟做錯了什么? 我認為,如果我能得到DataContext對象來代替=
同is
空值時,會刪除工作。 我不知道該怎么做。 我還假設之前已經問過這個問題,但我找不到它。
編輯:我最初稱我的鍵為“主要”而不是“外國”。 我打算說“外國人”。 我編輯我的帖子說“外國”。 我仍然遇到同樣的問題。
為了確保您還捕獲空值,您可以將查詢修改為如下所示:
select * FROM [tblOvrdImpVols]
WHERE ([key1] = @p0) AND
([key2] = @p1 OR
([key2] is null and @p1 is null) )
這里的主要問題 - 在SQL中,沒有任何東西等於NULL。 NULL甚至不等於它自己! 在SQL查詢中,“NULL = NULL”將評估為“false”。 因此,當你需要刪除[key2] == null的行時,你需要編寫LINQ查詢,它會產生類似SQL的
“WHERE [key2] = @ p1 AND [key2] IS NULL”
代替
“WHERE [key2] = @ p1 AND [key2] = @ p2”。
怎么做? 似乎正確的方法是將[key2]與null進行比較。 例如,如果要從名稱為NULL的tblSecurityMasterType獲取所有行,則這將是錯誤的方式:
string NameNull = null;
from sm in db.tblSecurityMasterType
where sm.Name == NameNull
select sm;
您將需要使用此查詢:
from sm in db.tblSecurityMasterType
where sm.Name == null
select sm;
它在這里描述: http : //smsohan.com/blog/2008/08/05/comparing-with-null-in-where-clause-in/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.