c# - 如何使用 Linq-to-SQL 删除具有空外键的行?

标签 c# sql-server linq-to-sql foreign-keys nullable

我有一个名为 tblOvrdImpVolsType 的表,其中有两个外键列都可以为 null。当此行中的一个外键列为空时,我无法使用 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 查询说明了这一点。唯一的区别是 iskey2 条件中的 =:

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 以获取空值,则删除将起作用。我不知道该怎么做。我也假设这个问题以前有人问过,但我找不到。

编辑:我最初称我的 key 为“主要”而不是“外来”。我的意思是说“外国”。我编辑了我的帖子,改为说“外国”。我仍然遇到同样的问题。

最佳答案

为确保您也捕获空值,您可以将查询修改为如下所示:

select * FROM [tblOvrdImpVols] 
WHERE ([key1] = @p0) AND 
([key2] = @p1 OR 
    ([key2] is null and @p1 is null) )

关于c# - 如何使用 Linq-to-SQL 删除具有空外键的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17576149/

相关文章:

c# - 理解调度队列

c# - InAirSignature.exe 中发生类型为 'System.IO.FileNotFoundException' 的未处理异常

sql - 如何使用 Powershell 检查 SQL Server 版本?

sql-server - SQL Server 中的 XP_DirTree

asp.net - LINQ to SQL、ExecuteQuery 等

.net - 使用 LINQ to SQL 获取 "string"列的最大长度

c# - HTTP 错误 500.52 - URL 重写模块错误。名称属性

javascript - 如何使用 ContentResult 从 Controller 操作结果返回 javascript?

python - SQL 查询计算来自 SQL Server 中同一表的不同行的计算

linq-to-sql - LINQ to SQL 在使用 DISTINCT 时不生成 ORDER BY?