0

我有一个 linq WHERE 语句,我想使用 cookie 值字符串 (aspxauth) 来匹配表中的字符串,但是我得到一个“对象引用未设置为对象的实例”。错误。

代码是:

        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 语句,我不会收到错误消息。

关于我在哪里出错的任何想法?

任何帮助表示赞赏,谢谢。

4

3 回答 3

0

它告诉您至少有一个会话项为空,或者您的 where 语句将集合过滤到零项。

于 2012-09-02T15:09:02.950 回答
0

如果没有元素匹配,您将收到此错误,where s.aspxauth == cookieUserloginStatus.sessions. FirstOrDefault() 将返回对象的默认值,即 null。

于 2012-09-02T15:09:57.943 回答
0

我的猜测是loginStatus.sessions序列中没有一个元素与 where 子句的条件匹配,导致loginstatus.FirstOrDefault()返回 null,所以当你尝试访问时.UserId,你会得到 null 引用异常。

您应该自己检查 null 并处理此案:

var firstLoginStatusMatch = loginstatus.FirstOrDefault();

if (firstLoginStatusMatch  == null)
{
   // Handle no match
}

var userId = firstLoginStatusMatch.UserId.ToString()

我还建议将变量命名为更具描述性。您有两个同名但大小写不同的变量,这使得代码很难扫描。

于 2012-09-02T15:10:38.270 回答