2012-12-13 79 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很好 - 您可以进行分页,将页面存入内存,然后执行组合。我完全同意你不想加载整个表格,但我没有建议。 –

相关问题