C# 如何使用Linq to SQL删除外键为空的行?

C# 如何使用Linq to SQL删除外键为空的行?,c#,sql-server,linq-to-sql,foreign-keys,nullable,C#,Sql Server,Linq To Sql,Foreign Keys,Nullable,我有一个名为tbloverdimpvolstype的表,其中有两个外键列都可以为空。当此行中的一个外键列为null时,使用Linq To SQL删除该表中的一行时遇到问题。这是我的密码: using (Databases.Global db = new Databases.Global()) { db.Log = Console.Out; var records = from iv in db.tblOvrdImpVolsType join

我有一个名为
tbloverdimpvolstype
的表,其中有两个外键列都可以为空。当此行中的一个外键列为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
}
我认为问题在于
[key2]=@p1
部分。因为我感兴趣的key2值为null,所以SQL是错误的。下面的这些SQL查询说明了这一点。唯一的区别是在
键2
条件下,
is
=
的区别:

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的查询

“其中[key2]=@p1和[key2]为空”

而不是

其中[key2]=@p1和[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;

此处描述:

据我所知,SQL Server不允许主键的任何列为空。不知道你是怎么做到的-我认为这基本上不应该是可行的…你能为表生成一个脚本,这样我们就可以看到你所说的“可空主键”是什么意思吗?更不用说疯狂的尝试了。废话,我的意思是外键。在我的代码中,
key1
key2
都是外键,而不是主键。我的错误。我认为您的数据库模型一定是错误的,并且用IsPrimaryKey属性标记了Key1和Key2。
from sm in db.tblSecurityMasterType 
     where sm.Name == null
     select sm;