2010-09-08 52 views
0

HI,Linq在插入到数据库之前比较

我有Ling表和MyObject。

它得到了场:

标识 数 名称

有,增加了NE的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没有行被选中,我不知道为什么:/

任何提示如何检查是否在fileds中除了Id(这是PK)的excactly相同的值已经在数据库中?

感谢您的帮助

+0

我有灵表的MyObject。 ?真的很有趣 – 2010-09-08 08:10:34

+0

你确定this.Number和this.Name有一些值吗?你调试了你的代码吗? – 2010-09-08 08:12:19

+0

在DataContext中有一个Object MyObject。是的我确定我在调试。例如Number = null,Name = John – gruber 2010-09-08 08:22:37

回答

1

LINQ到SQL,当你给它用等号,恰好为空可为空参数表达有问题 - 它创建查询不正确。您可以在此阅读全部内容: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; 
+0

这就是我害怕真实世界的例子,有更多的字段需要检查:/无论如何感谢您的帮助 – gruber 2010-09-08 08:50:31

0

试试这个:

是LINQ产生
var result = from m in myContext.MyObjects 
       where (((m.Number == this.Number) || (m.Number == null)) && 
        ((m.Name == this.Name) || (m.Name == null))) 
       select m; 

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))