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