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