我有以下的Linq Lambda表达式:
private IEnumerable<SubjectSelectorSubjectGroup> GetSubjectList()
{
User user = db.Users.Find(WebSecurity.CurrentUserId);
return db.RequiredSubjects.Where(r => !r.Subject.Name.Contains("Home"))
.GroupBy(r => r.Subject)
.OrderByDescending(r => r.Count())
.Select(r => new SubjectSelectorSubjectGroup()
{
SubjectId = r.Key.SubjectId,
SubjectName = r.Key.Name,
IsInFavourites = HttpContext.Current.Request.IsAuthenticated &&
(user.Elective1 != null && user.Elective1.SubjectId == r.Key.SubjectId ||
user.Elective2 != null && user.Elective2.SubjectId == r.Key.SubjectId ||
user.Elective3 != null && user.Elective3.SubjectId == r.Key.SubjectId),
Occurrences = r.Count()
});
}
当用户未登录时,此函数中的
user
变量为null。这本不应该成为问题,因为短路布尔运算应该解决这个问题。问题在于,它并没有!相反,抛出了一个System.NullReferenceException
。当用户为null时,
HttpContext.Current.Request.IsAuthenticated
返回false。我通过注释引用user
变量的括号部分来检查这一点,然后表达式正确地计算出来。有人知道为什么在这种情况下
Linq to Sql
会尝试去取消引用user
变量,而实际上这是不必要的吗?有人对此问题有解决方法吗?