【发布时间】:2013-01-09 07:09:15
【问题描述】:
我有以下 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 变量为空。这应该不是问题,因为短路布尔评估应该处理这个问题。问题是,它没有!相反,System.NullReferenceException 被抛出。
当用户为 null 时 HttpContext.Current.Request.IsAuthenticated 返回 false。我通过注释掉引用 user 变量的括号部分来检查这一点,然后表达式正确计算。
有谁知道为什么Linq to Sql 试图在这种情况下取消对user 变量的引用,而实际上并不需要它?有没有人可以解决这个问题?
【问题讨论】:
-
NullReferenceException当引用为空在内存中时被抛出。这表明该查询的一部分未转换为 SQL,而是在内存中进行评估。你能检查发出的 SQL 查询吗?罪魁祸首应该是没有翻译成SQL的部分。 -
嗨格特。我已经通过创建 List
解决了这个问题。但作为一个有趣的问题,我如何检查发出的 SQL 查询?我是 Linq 的新手,所以仍然想弄清楚这些东西。感谢您的评论。 -
你可以使用DataContext.Log,当然也可以使用Sql profiler。
-
感谢您提供的信息,格特。
标签: c# linq linq-to-sql lambda