SingleOrDefault
возвращает нуль, если список не содержит ровно один элемент.
Если ваше предложение «где» a.Name == 'B'
не возвращает ровно один элемент, тогда результат будет равен нулю.
Так что если в списке ваших сторон нет только одного «B» (т.е. нет ни одного или 2 или более 2), результат SingleOrDefault
будет равен нулю, а .Surfaces
предоставит ошибку «Ссылка на объект не установлена на экземпляр объекта.
Если вы просто хотите, счетчик в ноль, когда не только одна сторона B, а затем использовать:
console.log("@(Model.Sides.SingleOrDefault(a => a.Name == "B") ?? new Side { Surfaces = new List<Surface>() }).Surfaces.Count");
где ?? означает: если левая часть равна нулю, вернуть это вместо нулевой и создать фиктивный Side
с пустым списком, так что Surfaces.Count == 0
В качестве альтернативы, используйте переменную:
@{
var side = Model.Sides.SingleOrDefault(a => a.Name == "B");
if (side == null)
{
@:console.log("none")
}
else
{
@:console.log(@side.Surfaces.Count);
}
}
в качестве альтернативы очиститель, вы можете использовать SelectMany()
вместо этого, что-то вроде (непроверенные):
Model.Sides.Where(a=>a.Name=="B").SelectMany(x=>x.Surfaces).Count()
, то вам не нужно беспокоиться о временных переменных и т.д., но будет возвращать число «поверхностей» для всех «B» сторон, поэтому может не быть вашим требованием.
Вам нужно будет избежать console.log @ т.е: console.log ("0"); – heymega