2011-01-19 96 views
1

任何人都可以向我解釋爲什麼這兩個功能不同嗎?Linq到SQL查詢不返回預期結果

我的樣本數據第一個返回null,第二個返回預期結果。我把+ @""部分放在避免調用空字符串替換。

代碼總是在我的樣本數據返回null:

to_follows_contact = db.CONTACTs.Where(n => 
    n.ACCOUNTID == account.ACCOUNTID 
    && (
     (n.FIRSTNAME + n.MIDDLENAME + n.LASTNAME + @"").Replace(@" ", @"") 
                  == @"TOFOLLOW" 
     || 
     (n.FIRSTNAME + n.MIDDLENAME + n.LASTNAME + @"").Replace(@" ", @"") 
                  == @"FOLLOWTO" 
    ) 
).FirstOrDefault(); 

代碼在我的樣本數據返回正確的聯繫:

foreach (CONTACT n in db.CONTACTs.Where(n => n.ACCOUNTID == account.ACCOUNTID)) 
{ 
    string ContactName = (n.FIRSTNAME + n.MIDDLENAME + n.LASTNAME + @"") 
         .Replace(@" ", @""); 
    if (ContactName == @"TOFOLLOW" || ContactName == @"FOLLOWTO") 
     to_follows_contact = n; 
} 
+0

到目前爲止,我對你的問題和你一樣感到困惑......我只想指出,在這種情況下,C#逐字字符串的`@`符號不是必需的。 – Thorarin 2011-01-19 08:47:57

+2

試着看看生成的SQL,可能是一個問題。 – SWeko 2011-01-19 09:00:31

回答

5

發生了什麼事,是第一個代碼示例實際上在T-SQL中完全解決了這個問題。不幸的是,從C#到SQL的轉換並不完全透明。

SQL處理空值的方式與.NET不同。 SELECT 'Foo' + NULL + 'Bar'將返回NULL。你需要使用COALESCE或類似的東西。在LINQ to SQL中,轉化爲:

(n.FIRSTNAME ?? "" + n.MIDDLENAME ?? "" + n.LASTNAME ?? "").Replace(" ", "") 

如果您使用的,它應該工作的罰款。

如果您有興趣,可以使用db.GetCommand(IQueryable<T>)來獲取生成的SQL語句。當您在調試過程中將鼠標懸停在一段源代碼中的IQueryable變量上時也可用。

*:這實際上取決於您可以設置的某些數據庫選項,但這是默認行爲。

1

根據猜測,生成的SQL將連接各種字符串,但是,如果其中一個爲null,那麼總是會從連接返回NULL,從而無法通過相等性測試。

在代碼中,字符串將始終是空的,然後將工作。