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