如果字段包含null,则整个串联结果为null

时间:2018-09-02 18:17:04

标签: c# postgresql asp.net-core entity-framework-core

我正在尝试串联一个标签。如果字段包含null,则整个串联结果为null

[HttpGet]
public ActionResult PMAByPC(string PartnerCode)
{
    var result = (from N in _POSContext.PMAs
                  where (N.PartnerCode == PartnerCode)
                  select new 
                  { 
                      label = N.Address1 + " | " + N.Address2 + " | " + N.City, 
                      id = N.ID 
                  });

    return Json(result);
}

此处,如果字段中不存在数据,则标签将变为null

我尝试过

select new { label = N.Address1 ?? "?" + " | " + N.Address2 ?? "?" + " | " + N.City ?? "?", id = N.ID }

然后,它仅使用N.Address1的值,而忽略其余字段。

2 个答案:

答案 0 :(得分:3)

这看起来像是标准的SQL字符串串联行为(与SqlServer数据库相同)。

如果要评估串联服务器端(数据库),则需要使用null运算符将""转换为空字符串??(或其他)。与您的尝试类似,但是您错过了C#运算符的优先级。您写的方式等同于

N.Address1 ??
(
  ("?" + " | " + N.Address2) ??
  (
      ("?" + " | " + N.City) ?? "?"
  )
)

这不是目的。

您可以通过将类似的转换括在方括号中来避免此类问题:

select new
{
    label = (N.Address1 ?? "?") + " | " + (N.Address2 ?? "?") + " | " + (N.City ?? "?"),
    id = N.ID,
} 

答案 1 :(得分:0)

这是符合标准的合理行为:如果将字符串与未知字符串连接在一起,结果将是未知的。

为此使用coalesce函数

coalesce(col1, '') || coalesce(col2, '')