可为 null 的对象必须在计数表达式的上下文中具有值

Nullable object must have a value in Context of Count Expression

提问人:MelB 提问时间:9/6/2023 更新时间:9/6/2023 访问量:18

问:

我在 asp.net 应用程序的报告页面上收到此错误。我已经查看了有关此错误的问题的其他答案,但仍然无法理解如何解决它。

我从我的 .cshtml 页面收到此行的错误:

@(@Model.Results.Where(x => x.ArrestTime.Value.ToString("HH") == "00").Count() +

以下是发生这种情况的完整表行:

                            <tr>
                                <td width="16%" align="left">Count</td>
                                <td width="18%" align="right">
                                    @(@Model.Results.Where(x => x.ArrestTime.Value.ToString("HH") == "00").Count() +
                                    @Model.Results.Where(x => x.ArrestTime.Value.ToString("HH") == "01").Count() +
                                    @Model.Results.Where(x => x.ArrestTime.Value.ToString("HH") == "02").Count() +
                                    @Model.Results.Where(x => x.ArrestTime.Value.ToString("HH") == "03").Count() +
                                    @Model.Results.Where(x => x.ArrestTime.Value.ToString("HH") == "04").Count() +
                                    @Model.Results.Where(x => x.ArrestTime.Value.ToString("HH") == "05").Count())
                                </td>
                            </tr>

我的.cs如下:

public class IndexModel : PageModel
{
    private readonly ApplicationDbContext _db;

    public IndexModel(ApplicationDbContext db)
    {
        _db = db;
    }

    public IEnumerable<Incident> Results { get; set; }

    public void OnGet()
    {
        Results = _db.Incident.ToList();
    }

    public void OnPost(DateTime startdate, DateTime enddate, string sortOrder)
    {
        Results = (from x in _db.Incident where (x.ArrestDate >= startdate) && (x.ArrestDate <= enddate) select x).ToList();

        var startdate1 = startdate.ToShortDateString();
        var enddate1 = enddate.ToShortDateString();

        ViewData["startingparameter"] = $"Starting Arrest Date: {startdate1}";
        ViewData["endingparameter"] = $"Ending Arrest Date: {enddate1}";

    }

}

这所基于的模型 Incident 将 ArrestTime 设置为可为 null:

        [Display(Name = "Arrest Time")]
        [DataType(DataType.Time)]
        public DateTime? ArrestTime { get; set; }

所以,我不太确定为什么会这样。当我发布该应用程序时,它正在工作,但此后已停止,并且报告页面在尝试在生产环境中运行它时返回 500 错误。

我尝试添加 if(@Model.Results.Where(x => x.ArrestTime.HasValue){} 并将 Count 表达式放在 {} 中,但这不起作用。

任何建议将不胜感激。非常感谢。

asp.net if-statement razor nullreferenceexception

评论


答:

1赞 David 9/6/2023 #1

如果可为 null,则意味着它可能没有值。但是,此代码假定它始终具有一个值:ArrestTime

Model.Results.Where(x => x.ArrestTime.Value.ToString("HH") == "00")

如果它总是有一个值,那么不要让它可以为 null,只需使用 .但是,如果它可能没有值,则需要在尝试使用它之前检查该值是否存在。例如:DateTime

Model.Results.Where(x => x.ArrestTime.HasValue && x.ArrestTime.Value.ToString("HH") == "00")

或:

Model.Results.Where(x => x.ArrestTime != null && x.ArrestTime.Value.ToString("HH") == "00")

评论

0赞 MelB 9/6/2023
非常感谢!!我为自己没有想到只添加.HasValue 条件作为使用 && 的每个表达式的一部分。就是这么简单。再次感谢。