Если поле содержит ноль, тогда весь результат сцепления будет нулевым - PullRequest
0 голосов
/ 02 сентября 2018

Я пытаюсь объединить для метки. Если поле содержит 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 голосов
/ 03 сентября 2018

Это стандартное и разумное поведение: если вы объединяете строку с неизвестной строкой, результат неизвестен.

Для этого используйте функцию coalesce:

coalesce(col1, '') || coalesce(col2, '')
0 голосов
/ 02 сентября 2018

Похоже, это стандартное поведение конкатенации строк SQL (то же самое происходит с базой данных SqlServer).

Если вы хотите оценить сторону сервера конкатенации (базы данных), вам нужно преобразовать null в пустую строку "" (или что-то еще), используя оператор ??. Аналогично вашей попытке, но вы пропустили приоритет оператора C #. То, как вы это написали, эквивалентно

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

что не было целью.

Вы можете избежать таких проблем, заключив аналогичные преобразования в скобки:

select new
{
    label = (N.Address1 ?? "?") + " | " + (N.Address2 ?? "?") + " | " + (N.City ?? "?"),
    id = N.ID,
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...