gpt4 book ai didi

c# - Linq lambda 表达式中的 bool 短路评估

转载 作者:太空狗 更新时间:2023-10-29 21:18:16 25 4
gpt4 key购买 nike

我有以下 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 变量为空。这应该不是问题,因为短路 bool 值评估应该处理这个问题。问题是,它没有!而是抛出 System.NullReferenceException

当用户为空时 HttpContext.Current.Request.IsAuthenticated 返回 false。我通过注释掉引用 user 变量的括号部分来检查这一点,然后表达式计算正确。

有谁知道为什么 Linq to Sql 会在这种情况下尝试取消引用 user 变量,而实际上并没有必要这样做?有人可以解决这个问题吗?

最佳答案

整个表达式被翻译成 SQL 并计算为 SQL,这意味着 &&运算符(operator)没有像预期的那样短路。

您可以通过构建 ElectiveX.SubjectId 的列表或数组来解决问题您要搜索然后使用 tmpList.Contains(r.Key.SubjectId)在查询中。这将被翻译成 WHERE IN (...) SQL 表达式。

关于c# - Linq lambda 表达式中的 bool 短路评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14230012/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com