Linq为什么连接字符串导致null?

时间:2012-12-13 13:15:44

标签: c# linq

我认为"bill" + "john" + null == billjohn,但在我的这个例子中,它似乎正在评估为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

3 个答案:

答案 0 :(得分:7)

我猜这是使用LINQ-to-SQL或EF作为后端,它正在生成SQL。好吧,在TSQL中,与任何内容连接的null是(默认情况下):null。也许试试:

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

或更简单:首先将数据作为值存入内存,然后执行合成。

答案 1 :(得分:7)

在C#中,或者更确切地说在.NET中,你是对的,"bill" + "john" + null会给你"billjohn"

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

使用LINQ to Entities将您的C#转换为SQL,并且不会始终保留此类细微差别。

您可以使用更详细的

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

确保只连接非空字符串,这不会出现此问题。

答案 2 :(得分:3)

假设SQL-Server为rdbms,快速测试显示:

select 'A' + NULL;  // NULL

Demo

MSDN

  

+(String Concatenation)运算符在行为方面有所不同   使用空的零长度字符串比使用NULL时,   或未知的值。可以将零长度字符串指定为   两个单引号,引号内没有任何字符   分数。零长度二进制字符串可以指定为0x而不包含任何值   十六进制常量中指定的字节值。连接a   零长度字符串始终连接两个指定的字符串。 :当   你使用空值的字符串,结果   连接取决于会话设置。就像算术一样   当空值为时,对空值执行的操作   添加到已知值后,结果通常是未知值,a   使用空值执行的字符串连接操作   还应该产生一个空结果。但是,您可以更改此设置   通过更改CONCAT_NULL_YIELDS_NULL的设置来改变行为   本届会议。有关更多信息,请参见SET CONCAT_NULL_YIELDS_NULL   (的Transact-SQL)。如果字符串串联的结果超过   限制为8,000字节,结果被截断。但是,如果在   连接的字符串中至少有一个是大值类型,   截断不会发生。