2010-01-21 24 views
2

我的查詢看起來是這樣的:LINQ到SQL字符串用null值加入

var products = from p in Products 
       select new 
       { 
        ProductId = p.ProductId, 
        Description = p.Quantity + " x " p.Price + ", " + p.ItemDescription 
       }; 

我joinin在查詢中說明的原因,是我做這行的多個querys /對象,以創建歷史屏幕(有點像審計屏幕)。屏幕正在採取一段時間來加載,所以在這個例子中,我把所有的查詢的,並做了

products.Concat(otherProducts); 

速度大大增加(2-3分鐘下降到2-3秒),但是如果,p.ItemDescription(它是數據庫中的VARCHAR(50))爲空,但Quantity和Price不爲null,則整個Description字段將變爲null。

有沒有人遇到過這個怪癖?任何人都知道如何讓它顯示「4 x 5.99」,而不是將其設置爲空?

任何幫助將不勝感激,我一直在努力解決這個問題,甚至不知道如何真正在谷歌上搜索這個。

+0

你確定這是LINQ到SQL或LINQ到對象? – 2010-01-21 16:38:49

+0

@asdi:LINQ到對象會拋出異常。 – 2010-01-21 16:42:00

回答

6

這不是LINQ到SQL的「怪癖」,這是標準的SQL行爲。

如果我有表達:

columnA + columnB + columnC 

而且任何這些列的是null,那麼整個表達式將被評估爲null

您希望將空值合併到空字符串中。試試這個:

select new 
      { 
       ProductId = p.ProductId, 
       Description = p.Quantity + " x " + 
          p.Price + ", " + 
          (p.ItemDescription ?? "") 
      } 
2

在sql中,將null與任何其他值連接會導致null。

所以,你有兩個選擇。首先(這是我的方式),修改表中的ItemDescription字段不可爲空。設置一個類似''(空白)的默認值。問題消失。

第二個選項,修改您的linq代碼以合併ItemDescription字段,以便在基礎值爲null時發出空白。我不是一個linq傢伙,所以我不確定如何做到這一點。

第二條路線的問題之一是它必須爲產品結果集中的每個記錄運行coalesce函數,這可能會對性能造成負面影響。

2

這不是一個怪癖,這是SQL服務器上的默認行爲(可以使用SET CONCAT_NULL_YIELDS_NULL ON|OFF連接上啓用或禁用)。

您應該能夠使用這樣繞過它:

var products = from p in Products 
       select new 
       { 
        ProductId = p.ProductId, 
        Description = p.Quantity + " x " p.Price + ", " + (p.ItemDescription ?? "") 
       }; 
0

嘗試:

select new 
      { 
       ProductId = p.ProductId, 
       Description = string.Format(
          "{0} x {1}, {2}", 
          p.Quantity, 
          p.Price, 
          p.ItemDescription) 
      }