Linq在插入数据库之前进行比较

时间:2010-09-08 08:06:55

标签: c# .net linq-to-sql

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)之外的文件中具有完全相同值的行是否已存在于数据库中的任何提示?

感谢您的帮助

2 个答案:

答案 0 :(得分:1)

Linq-To-SQL在给它一个带有可为空参数的Equals表达式时遇到问题,该参数恰好为null - 它创建的查询不正确。你可以在这里阅读所有相关内容:http://riotingbits.com/2009/int-null-or-why-it-misbehaves-in-linq-to-sql/

您必须分别处理this.Numberthis.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))