[英]Linq Select Statement help needed - NullReferenceException after using FirstOrDefault
我有一个处理登录过程的LINQ语句。 传递有效的用户名和密码组合时,它可以正常工作。 但是,当我对无效凭据进行测试时,在下面的行中会显示NullReferenceException
错误,<<< ----------------在正确处理无效凭据方面需要帮助吗?
public int _accountID;
public int _securityLevelID;
public void GetLoginInfo(string EmailAddress, string Password)
{
LoginItem l = null;
{
try
{
using (RootsDataContext RDC = new RootsDataContext())
l = (from a in RDC.DBLogIns
where a.EmailAddress == EmailAddress
&& a.Password == Password
&& a.IsActive == 1
select new LoginItem
{
AccountIDFK = a.AccountIDFK,
SecurityLevelIDFK = a.SecurtityLevelIDFK,
}).FirstOrDefault();
_accountID = (int)l.AccountIDFK; <<<----------------
_securityLevelID = (int)l.SecurityLevelIDFK;
if (_accountID < 1 || _accountID == null)
{
lbl_LoginStatus.Text = "Invalid";
}
}
catch (Exception ex)
{
string error = ex.Message;
}
if (_accountID > 0)
{
if (_accountID == 1 && _securityLevelID == 1) // [Quentin]
{
Response.Redirect("~/AccountsMaster.aspx");
}
if (_accountID > 1 && _securityLevelID == 2) // [Companies]
{
Response.Redirect("~/CompanyMaster.aspx");
}
if (_accountID > 1 && _securityLevelID == 3) // [Branch]
{
Response.Redirect("~/BranchMaster.Aspx");
}
if (_accountID > 1 && _securityLevelID == 4) // [Clients]
{
Response.Redirect("~/Home.aspx");
}
}
}
}
通过说
// ...
}).FirstOrDefault();
如果找到匹配项,则将获取DBLogIn
对象;否则,将获取null
。
在访问属性AccountIDFK
和SecurityLevelIDFK
之前,您需要检查null:
// ... }).FirstOrDefault();
if (l != null)
{
_accountID = (int)l.AccountIDFK;
_securityLevelID = (int)l.SecurityLevelIDFK;
}
需要考虑的其他几点:
如果没有DBLogIn
记录与您提供的条件匹配,则FirstOrDefault方法将返回null,因此您需要在访问(int)l.AccountIDFK
之前首先检查l
是否为null。 此外,它看起来像lbl_LoginStatus.Text = "Invalid";
应该在l
为null时完成,因此您需要删除if (_accountID < 1 || _accountID == null)
块并按如下所示更改代码:
if (l != null)
{
_accountID = (int)l.AccountIDFK;
_securityLevelID = (int)l.SecurityLevelIDFK;
}
else
{
// logic when l is null
lbl_LoginStatus.Text = "Invalid";
}
或者,您也可以使用C#三元运算符检查l
是否为null
_accountID = l != null ? (int)l.AccountIDFK : 0;
_securityLevelID = l != null ? (int)l.SecurityLevelIDFK : 0;
if (_accountID < 1)
{
lbl_LoginStatus.Text = "Invalid";
}
使用前,应检查“ l”中的空值。
if(l!=null)
{
_accountID = (int)l.AccountIDFK;
_securityLevelID = (int)l.SecurityLevelIDFK;
}
else
{
lbl_LoginStatus.Text = "Invalid";
}
如果列表中没有与您的查询匹配的项目,Linq FirstOrDefault将返回null。因此,如果您的代码中为null,则意味着用户登录无效。
public int _accountID; public int _securityLevelID; public void GetLoginInfo(string EmailAddress, string Password) { LoginItem l = null; { try { using (RootsDataContext RDC = new RootsDataContext()) l = (from a in RDC.DBLogIns where a.EmailAddress == EmailAddress && a.Password == Password && a.IsActive == 1 select new LoginItem { AccountIDFK = a.AccountIDFK, SecurityLevelIDFK = a.SecurtityLevelIDFK, }).FirstOrDefault(); if(l==null || _accountID < 1 || _accountID == null) { lbl_LoginStatus.Text = "Invalid"; Response.Redirect("~/InvalidCredentials.aspx"); // redirect to invalid login page. } else { _accountID = (int)l.AccountIDFK; _securityLevelID = (int)l.SecurityLevelIDFK; } } catch (Exception ex) { string error = ex.Message; } if (_accountID > 0) { if (_accountID == 1 && _securityLevelID == 1) // [Quentin] { Response.Redirect("~/AccountsMaster.aspx"); } if (_accountID > 1 && _securityLevelID == 2) // [Companies] { Response.Redirect("~/CompanyMaster.aspx"); } if (_accountID > 1 && _securityLevelID == 3) // [Branch] { Response.Redirect("~/BranchMaster.Aspx"); } if (_accountID > 1 && _securityLevelID == 4) // [Clients] { Response.Redirect("~/Home.aspx"); } } } }
您应该检查LoginItem
的默认值null
,如果它为null(在无效凭据的情况下),则请执行任何操作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.