我有一个linq WHERE语句,我想使用cookie值字符串(aspxauth)来匹配表中的字符串,但我收到了一个"Object reference not set to a instance of a Object"错误。
代码为:
HttpCookie authCookie = Request.Cookies[".aspxauth"];
FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(authCookie.Value);
string cookieUser = authCookie.Value;
if (User.Identity.IsAuthenticated)
{
if (Request.Cookies[".aspxauth"] != null)
{
var loginStatus = new UsersDataContext();
var loginstatus = from s in loginStatus.sessions
where s.aspxauth == cookieUser
select s;
var x = loginstatus.FirstOrDefault().UserId.ToString();
如果我删除where语句,我就不会得到错误。
你知道我哪里错了吗??
感谢您的帮助。
我的猜测是loginStatus.sessions
序列中没有一个元素与where子句的条件匹配,导致loginstatus.FirstOrDefault()
返回null,因此当您尝试访问.UserId
时,会得到null引用异常。
你应该自己检查null并处理这种情况:
var firstLoginStatusMatch = loginstatus.FirstOrDefault();
if (firstLoginStatusMatch == null)
{
// Handle no match
}
var userId = firstLoginStatusMatch.UserId.ToString()
我还建议为变量命名更具描述性。您有两个同名但大小写不同的变量,这使得代码很难扫描。
它告诉您至少有一个会话项为null,或者where语句将集合筛选为零项。
如果没有元素匹配,就会出现此错误,即where s.aspxauth == cookieUser
对于loginStatus.sessions
中的每个元素都为false。FirstOrDefault()将返回对象的默认值,该值为null。