代码之家  ›  专栏  ›  技术社区  ›  MelB

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

  •  0
  • MelB  · 技术社区  · 1 年前

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

    我从我的.cs.html页面收到了这一行的错误:

    @(@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表达式放入{}中,但这不起作用。

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

    1 回复  |  直到 1 年前
        1
  •  1
  •   David    1 年前

    如果 ArrestTime 是可以为null的,那么这意味着它 可能不会 具有值。但是,此代码假定 总是 具有值:

    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")