HI,
我有Ling Table和MyObject。
它有字段:
标识 数 名称
有一种方法可以将My MyObject添加到数据库中。在部分类MyOBject我实现OnValidate方法。我需要检查是否已经有一行包含这样的号码和名称。
问题在于此值为空(对于此示例,两者都可以)
var result = from m in myContext.MyObjects where m.Number == this.Number &&
m.Name == this.Name
select m;
if(result.Count > 0) {
throw ...
}
如果例如this.Name = null且r.Name = null且m.Number == this.Number没有选择行,我不知道原因:/
关于如何检查除了Id(PK)之外的文件中具有完全相同值的行是否已存在于数据库中的任何提示?
感谢您的帮助
答案 0 :(得分:1)
Linq-To-SQL在给它一个带有可为空参数的Equals表达式时遇到问题,该参数恰好为null - 它创建的查询不正确。你可以在这里阅读所有相关内容:http://riotingbits.com/2009/int-null-or-why-it-misbehaves-in-linq-to-sql/
您必须分别处理this.Number
或this.Name
为空的案例。
IQueryable<MyObject> result = null;
if (this.Name == null && this.Number == null)
result = from m in myContext.MyObjects
where m.Name == null && m.Number == null
select m;
else if (this.Name == null)
result = from m in myContext.MyObjects
where m.Name == null && m.Number == this.Number
select m;
else if (this.Number == null)
result = from m in myContext.MyObjects
where m.Name == this.Name && m.Number == null
select m;
else
result = from m in myContext.MyObjects
where m.Name == this.Name && m.Number == this.Number
select m;
答案 1 :(得分:0)
试试这个:
var result = from m in myContext.MyObjects
where (((m.Number == this.Number) || (m.Number == null)) &&
((m.Name == this.Name) || (m.Name == null)))
select m;
LINQ生成的SQL查询将是:
SELECT Whatewer yourObject contains
FROM yourTable as [t0]
WHERE (([t0].[Number] = @p0) OR ([t0].[Number] IS NULL))
AND (([t0].[Name] = @p1) OR ([t0].[Name] IS NULL))