我有以下 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
该函数中的变量为空。这应该不是问题,因为短路布尔求值should处理它。问题是,事实并非如此!相反,一个System.NullReferenceException
被抛出。
当用户为空时HttpContext.Current.Request.IsAuthenticated
返回假。我已经通过注释掉引用的括号部分来检查了这一点user
变量,然后表达式计算正确。
有谁知道为什么Linq to Sql
尝试取消引用user
在这种情况下实际上不需要变量吗?有人可以解决这个问题吗?
整个表达式被翻译为 SQL 并进行计算,这意味着&&
操作员没有像预期那样短路。
您可以通过构建列表或数组来解决问题ElectiveX.SubjectId
您想要搜索然后使用tmpList.Contains(r.Key.SubjectId)
在查询中。这将被翻译成WHERE IN (...)
SQL 表达式。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)