在linq-where语句中使用cookie值



我有一个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。

最新更新