Как заставить Null Coalesce работать в ASP.NET MVC Razor?

У меня есть следующее, но с ошибкой NullReferenceException:

<td>@item.FundPerformance.Where(xx => fund.Id == xx.Id).FirstOrDefault().OneMonth ?? -</td>

OneMonth определяется как

public virtual decimal? OneMonth { get; set; }

и его значение равно нулю в момент его отказа.

Я думал, что оператор Null Coalesce будет тестировать, если его нуль и если да, верните значение справа от оператора?

Что мне нужно изменить, чтобы сделать эту работу?

Ответ 1

Синтаксис бритвы, как вы его написали, заканчивается на "OneMonth". The?? интерпретируются как текст. Чтобы интерпретировать его как бритву, вы должны обернуть все утверждения в() следующим образом:

<td>@(item.FundPerformance.Where(xx => fund.Id == xx.Id).FirstOrDefault().OneMonth ?? "-")</td>

Это все равно приведет к ошибке: левый оператор является десятичным, а правый - строкой. Таким образом, вы можете либо сделать ноль вместо "-", либо использовать трехмерный оператор, а OneMonth.Value.ToString() как левое значение и "-" как правое значение.

Ответ 2

Это не связано с MVC или Razor.

FundPerformance.Where(xx => fund.Id == xx.Id).FirstOrDefault()

будет возвращать значение null, если нет элемента, который соответствует, null не имеет свойства OneMonth, поэтому вы получите исключение null ref. Вы не можете использовать оператор, поскольку он не является OneMonth, который является нулевым, это результат FirstOrDefault().

Чтобы проверить изменение кода на

FundPerformance.Where(xx => fund.Id == xx.Id).First().OneMonth ?? -</td>

Если вы получаете исключение "последовательность не содержит элементов", тогда вы знаете, что это ваша проблема.