簡體   English   中英

如何使用Linq-to-SQL刪除具有空外鍵的行?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM