我有一个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语句,我不会收到错误。
关于我在哪里出错的任何想法?
感谢任何帮助,谢谢。
答案 0 :(得分:0)
它告诉您至少有一个会话项为null,或者您的where语句将集合过滤为零项。
答案 1 :(得分:0)
如果没有元素匹配,您将收到此错误,即where s.aspxauth == cookieUser
中每个元素的loginStatus.sessions
为false。 FirstOrDefault()将返回对象的默认值,该值为null。
答案 2 :(得分:0)
我的猜测是loginStatus.sessions
序列中的所有元素都不匹配where子句的条件,导致loginstatus.FirstOrDefault()
返回null,所以当你尝试访问.UserId
时,你得到空引用异常。
您应该自己检查null并处理案例:
var firstLoginStatusMatch = loginstatus.FirstOrDefault();
if (firstLoginStatusMatch == null)
{
// Handle no match
}
var userId = firstLoginStatusMatch.UserId.ToString()
我还建议将变量命名为更具描述性。你有两个同名但外壳不同的变量,这使得代码很难扫描。