c# – Linq lambda表达式中的布尔短路评估
发布时间:2020-12-15 04:14:11 所属栏目:百科 来源:网络整理
导读:我有以下 Linq lambda表达式: private IEnumerableSubjectSelectorSubjectGroup GetSubjectList(){ User user = db.Users.Find(WebSecurity.CurrentUserId); return db.RequiredSubjects.Where(r = !r.Subject.Name.Contains("Home")) .GroupBy(r = r.Subje
我有以下
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() }); } 当用户未登录时,此函数中的用户变量为null.这不应该是一个问题,因为短路布尔评估应该处理这个问题.问题是,它没有!而是抛出System.NullReferenceException. 当用户为null时,HttpContext.Current.Request.IsAuthenticated返回false.我通过注释引用用户变量的括号部分来检查这一点,然后表达式正确评估. 有谁知道为什么Linq to Sql在这种情况下试图取消引用用户变量时它实际上不应该是必要的?有没有人解决这个问题? 解决方法
整个表达式被翻译为SQL并进行评估,这意味着&&操作符没有按预期短路.
您可以通过构建要搜索的ElectiveX.SubjectId的列表或数组来解决问题,然后在查询中使用tmpList.Contains(r.Key.SubjectId).这将被转换为WHERE IN(…)SQL表达式. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |