2012-12-13 81 views
4

我認爲"bill" + "john" + null == billjohn,但在我的這個例子似乎被評估爲null:Linq爲什麼連接字符串會導致null?

var clients = from client in taxPortalService.Client() 
          select new ClientViewModel 
           {        
            ResidentialAddressLine1 = client.RESADDRESSLINE1, 
            ResidentialAddressLine2 = client.RESADDRESSLINE2, 
            ResidentialAddressLine3 = client.RESADDRESSLINE3, 
            ResidentialAddressLine4 = client.RESADDRESSLINE4, 
            ResidentialPostalCode = client.RESPOSTCODE, 
            ResidentialCountry = client.RESCOUNTRY, 
            IAResidentialAddress = client.RESADDRESSLINE1 + ", " + client.RESADDRESSLINE2 + ", " + client.RESADDRESSLINE3 + ", " + client.RESADDRESSLINE4 + ", " + client.RESPOSTCODE + ", " + client.RESCOUNTRY        
           }; 

我失去的東西在這裏很明顯?

enter image description here

回答

6

在C#中,或者說在.NET中,你是對的,"bill" + "john" + null給你"billjohn"

在SQL中,'bill' + 'john' + null爲您提供null

使用LINQ to Entities將C#轉換爲SQL,並不總是保留這種細微差別。

可以使用更詳細的

(client.RESADDRESSLINE1 ?? "") + ", " + (client.RESADDRESSLINE2 ?? "") + ", " + ... 

,以確保您只串聯非空字符串,不會有這個問題。

3

假設SQL-Server作爲RDBMS,快速測試顯示:

select 'A' + NULL; // NULL 

Demo

MSDN

的+(字符串串聯)操作時出現異常行爲它 作品瓦特是一個空的零長度字符串,與NULL, 或未知值一起工作。一個零長度的字符串可以被指定爲 兩個單引號,而在引號 標記內沒有任何字符。一個零長度的二進制字符串可以被指定爲0x,而不用任何在十六進制常量中指定的 字節值。連接一個 零長度字符串總是連接兩個指定的字符串。 當您使用空值字符串處理 時, 級聯的結果取決於會話設置。就像在空值上執行的算術操作 一樣,當將空值 添加到已知值時,結果通常爲未知值,但使用空值 執行的 字符串連接操作也應產生空值結果。但是,您可以通過更改當前會話的 CONCAT_NULL_YIELDS_NULL的設置來更改此行爲 行爲。有關更多信息,請參閱SET CONCAT_NULL_YIELDS_NULL (Transact-SQL)。如果字符串連接的結果超過了8,000字節的限制,則結果將被截斷。但是,如果在 連接的字符串中至少有一個是較大的值類型,則不會發生截斷 。

7

我猜這是使用LINQ-to-SQL或EF作爲後端,它正在生成SQL。那麼,在TSQL a null與任何東西連接(默認):null。也許嘗試:

(row.Foo ?? "") + ", " + (row.Bar ?? "") + ... 

或更容易:獲取數據的值到內存第一,然後組成。

+0

啊是的,它使用SQL服務器和EF並返回一個ObjectQuery 。我試圖避免將整個數據集放到內存中,因爲我想應用分頁而不返回所有數據。 – woggles

+0

@woggles很好 - 您可以進行分頁,將頁面存入內存,然後執行組合。我完全同意你不想加載整個表格,但我沒有建議。 –

相關問題