0

Cookie 値文字列 (aspxauth) を使用してテーブル内の文字列と一致させたい linq WHERE ステートメントがありますが、「オブジェクト参照がオブジェクトのインスタンスに設定されていません」というメッセージが表示されます。エラー。

コードは次のとおりです。

        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

セッション アイテムの少なくとも 1 つが null であるか、where ステートメントがコレクションをフィルター処理してアイテムをゼロにしたことを示しています。

于 2012-09-02T15:09:02.950 に答える
0

一致する要素がない場合、このエラーが発生します。つまり、where s.aspxauth == cookieUserのすべての要素で が false ですloginStatus.sessions。FirstOrDefault() は、オブジェクトのデフォルト値である null を返します。

于 2012-09-02T15:09:57.943 に答える
0

私の推測では、シーケンス内のどの要素もloginStatus.sessionswhere 句の条件に一致しloginstatus.FirstOrDefault()ないため、null が返されるため、にアクセスしようとすると.UserIdnull 参照例外が発生します。

自分で null をチェックして、ケースを処理する必要があります。

var firstLoginStatusMatch = loginstatus.FirstOrDefault();

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

var userId = firstLoginStatusMatch.UserId.ToString()

また、変数にわかりやすい名前を付けることをお勧めします。同じ名前の 2 つの変数がありますが、大文字と小文字が異なるため、コードをスキャンするのが非常に難しくなります。

于 2012-09-02T15:10:38.270 に答える