C# 生产中任何无法在本地复制的方法的NullReferenceException

C# 生产中任何无法在本地复制的方法的NullReferenceException,c#,linq,asp.net-mvc-4,nullreferenceexception,C#,Linq,Asp.net Mvc 4,Nullreferenceexception,当我浏览我们的MVC4网站时,除其他外,该网站可用于制定时间表,并转到/时间表,我看到错误消息: System.NullReferenceException:对象引用未设置为实例 指一个物体。(……) 堆栈跟踪: [NullReferenceException:对象引用未设置为 对象。] ASP.\页面\视图\时间表\索引\ cshtml.b\ 5(时间表s)+54 System.Linq.Enumerable.Any(IEnumerable1源,Func2谓词) +146 ASP.\页面\视图

当我浏览我们的MVC4网站时,除其他外,该网站可用于制定时间表,并转到/时间表,我看到错误消息:

System.NullReferenceException:对象引用未设置为实例 指一个物体。(……)

堆栈跟踪: [NullReferenceException:对象引用未设置为 对象。]
ASP.\页面\视图\时间表\索引\ cshtml.b\ 5(时间表s)+54
System.Linq.Enumerable.Any(IEnumerable
1源,Func
2谓词) +146 ASP.\页面\视图\时间表\索引\ cshtml.Execute()+4057 System.Web.WebPages.WebPageBase.ExecutePageHierarchy()+198
System.Web.Mvc.WebViewPage.ExecutePageHierarchy()+104
System.Web.WebPages.StartPage.RunPage()+17
System.Web.WebPages.StartPage.ExecutePageHierarchy()+64(…)

这是不可取的。不幸的是,我无法在生产环境中将编译模式置于调试状态,并且在本地无法再现错误。我很想把它修好,我希望这里有人能帮我。我将尝试解决这个问题,并希望您愿意考虑:

查看上面的堆栈跟踪,我看到一个
Any()
调用,在
timeline/Index.cshtml
上只有两个
Any()
调用,在控制器中只有一个

我们有一个计划和一个提议模型:(计划用于存储日期、用户和状态,如果用户希望更改与其他用户的日期,则使用该提议)

我在本地看到的是,这个方法总是返回一个空列表,但不是
null
。(它能否返回
null
?)

还有一个
TimetableController
,有一种方法:

[HttpGet]
public ActionResult Index()
{
    var dates = Schedule.GetCorveeDatesNextThirtyDays(); // returns dates that are not weekends
    var schedulesNextThirtyDays = db.Schedules.Where(s =>  
                             dates.Contains(s.Date)).ToList();

    var schedules = schedulesNextThirtyDays.Where(s => s.State == 
                             ScheduleState.Active).ToList();

    if (!schedules.Any(s => s.Date.Equals(DateTime.Now.Date))) //Any in controller
    {
        var todays_schedule = schedulesNextThirtyDays.Where(s => s.State == 
                ScheduleState.Completed).FirstOrDefault(s => dates.Contains(s.Date));
        if(todays_schedule != null)
            schedules.Add(todays_schedule);
    }

    return View(new DatesAndSchedulesViewModel(dates, schedules));
}
其中,
Dates和schedulesviewmodel
由构造函数中设置的
i收集计划
i收集日期
组成

在时间表视图中,
日期和schedulesviewmodel
作为
模型
我们有以下发生在
时间表之后的代码!=空
检查:

@if (Model.Schedules.Any(s => s.User.Name.Equals(User.Identity.Name))) //First Any() on view
{
    if (schedule.State == ScheduleState.Active)
    {
        if (schedule.GetActiveAssociatedProposals().Any()) //Second Any() on view
        {
            <span>Do something</span>
        }
    }
}
@if(Model.Schedules.Any(s=>s.User.Name.Equals(User.Identity.Name))//视图中的第一个Any()
{
if(schedule.State==ScheduleState.Active)
{
if(schedule.getActiveAssociatedPropositions().Any())//视图中的第二个Any()
{
做点什么
}
}
}
我知道Linq的
Any()
如果在
null
上执行,则会引发NullReferenceException。我想知道的是
时间表
视图上的
schedule.getActiveAssociatedPropositions()
是否可能返回
null
,从而引发上述异常?或者控制器中的(!schedules.Any(s=>s.Date.Equals(DateTime.Now.Date))是否可以检查
null


如果是这样,在执行检查之前,可以通过检查某些属性是否为
null
来解决问题。我希望有人能告诉我是否确实如此,并让我开始了解如何实现
null
-检查

Any可以返回null,但在本例中,抛出null的是lambda

从stacktrace中:

ASP._Page_Views_Timetable_Index_cshtml.b__5(Schedule s) +54
b_uu5
表示由
Any
中使用的lambda创建的内部类

if (!schedules.Any(s => s.Date.Equals(DateTime.Now.Date)))
我的猜测是
s
为null,因此列表不是空的,而是包含null元素

编辑:Oops,错误
Any

@if (Model.Schedules.Any(s => s.User.Name.Equals(User.Identity.Name)))

这更有意义
User
可以为null,或者
Name
可以为null。

任何人都可以返回null,但在这种情况下,抛出null的是lambda

从stacktrace中:

ASP._Page_Views_Timetable_Index_cshtml.b__5(Schedule s) +54
b_uu5
表示由
Any
中使用的lambda创建的内部类

if (!schedules.Any(s => s.Date.Equals(DateTime.Now.Date)))
我的猜测是
s
为null,因此列表不是空的,而是包含null元素

编辑:Oops,错误
Any

@if (Model.Schedules.Any(s => s.User.Name.Equals(User.Identity.Name)))

这更有意义
User
可以为null,或者
Name
可以为null。

任何人都可以返回null,但在这种情况下,抛出null的是lambda

从stacktrace中:

ASP._Page_Views_Timetable_Index_cshtml.b__5(Schedule s) +54
b_uu5
表示由
Any
中使用的lambda创建的内部类

if (!schedules.Any(s => s.Date.Equals(DateTime.Now.Date)))
我的猜测是
s
为null,因此列表不是空的,而是包含null元素

编辑:Oops,错误
Any

@if (Model.Schedules.Any(s => s.User.Name.Equals(User.Identity.Name)))

这更有意义
User
可以为null,或者
Name
可以为null。

任何人都可以返回null,但在这种情况下,抛出null的是lambda

从stacktrace中:

ASP._Page_Views_Timetable_Index_cshtml.b__5(Schedule s) +54
b_uu5
表示由
Any
中使用的lambda创建的内部类

if (!schedules.Any(s => s.Date.Equals(DateTime.Now.Date)))
我的猜测是
s
为null,因此列表不是空的,而是包含null元素

编辑:Oops,错误
Any

@if (Model.Schedules.Any(s => s.User.Name.Equals(User.Identity.Name)))


这更有意义
User
可以为空,或者
Name
可以为空。

b_5
表示内部类。:-)哇,你怎么知道你不介意我问?问过这个问题后,
Schedules
表不允许所有列都为空,因此我不理解
db.Schedules.Where(s=>dates.Contains(s.Date)).ToList()是如何工作的
可能包含空元素?而且
Schedule
UserId
User
Name
不能为空。@user2609980我只识别C编译器用于lambda的名称。双下划线是个好符号。对
s
执行空检查是否有帮助?就像在
@if(Model.Schedules.Any(s=>s.User!=null&&s.User.Name!=null&&s.User.Name.Equals(User.Identity.Name))
?@user2609980是的,这是一种情况,我只是开始在可疑区域设置空保护,希望能够解决问题。
b_5
表示一个内部类。:-)哇,你怎么知道你不知道