5

我认为"bill" + "john" + null == billjohn,但在我的这个例子中,它似乎评估为空:

 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                               
                              };

我在这里遗漏了一些明显的东西吗?

在此处输入图像描述

4

3 回答 3

8

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

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

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

于 2012-12-13T13:21:56.560 回答
7

在 C# 中,或者更确切地说在 .NET 中,您是对的,"bill" + "john" + null它为您提供"billjohn".

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

使用 LINQ to Entities 将您的 C# 转换为 SQL,并且并不总是保留诸如此类的细微差别。

您可以使用更详细的

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

确保您只连接非空字符串,这不会有这个问题。

于 2012-12-13T13:22:58.320 回答
3

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

select 'A' + NULL;  // NULL

演示

MSDN

+(字符串连接)运算符在处理空的零长度字符串时的行为与处理 NULL 或未知值时的行为不同。零长度字符串可以指定为两个单引号,引号内不包含任何字符。零长度二进制字符串可以指定为 0x,而无需在十六进制常量中指定任何字节值。连接一个长度为零的字符串总是连接两个指定的字符串。当您使用具有空值的字符串时,连接的结果取决于会话设置。就像对空值执行的算术运算一样,当将空值添加到已知值时,结果通常是未知值,对空值执行的字符串连接操作也应该产生空结果。但是,您可以通过更改当前会话的 CONCAT_NULL_YIELDS_NULL 设置来更改此行为。有关详细信息,请参阅 SET CONCAT_NULL_YIELDS_NULL (Transact-SQL)。如果字符串连接的结果超过 8,000 字节的限制,则结果将被截断。但是,如果连接的字符串中至少有一个是大值类型,则不会发生截断。

于 2012-12-13T13:21:20.510 回答