我正在研究linq查询。我有一个名为tblUsers的表,它的列名是username,password,reattamp和isLocked。使用linq查询我正在检查用户名和密码然后如果用户名帐户被锁定我想要返回false否则如果用户帐户被解锁并且用户名和密码是正确的那么我想方法返回true ..我有以下错误我压缩查询。
Severity Code Description Project File Line Suppression State
Error CS0266 Cannot implicitly convert type 'int?' to 'int'. An explicit conversion exists (are you missing a cast?) HalifaxWCFProject
这是我在ADO.NET中的代码和工作罚款......
public bool AuthenticateUser(UserLogin userLogin)
{
string CS = ConfigurationManager.ConnectionStrings["DBCS"].ConnectionString;
using (SqlConnection con = new SqlConnection(CS))
{
var result = false;
SqlCommand cmd = new SqlCommand("spAuthenticateUser", con);
cmd.CommandType = CommandType.StoredProcedure;
string encryptedpassword = FormsAuthentication.HashPasswordForStoringInConfigFile(userLogin.Password, "SHA1");
SqlParameter paramUsername = new SqlParameter("@UserName", userLogin.Username);
SqlParameter paramPassword = new SqlParameter("@Password", encryptedpassword);
cmd.Parameters.Add(paramUsername);
cmd.Parameters.Add(paramPassword);
con.Open();
SqlDataReader rdr = cmd.ExecuteReader();
if (rdr.HasRows)
{
while (rdr.Read())
{
int RetryAttempts = Convert.ToInt32(rdr["RetryAttempts"]);
if (Convert.ToBoolean(rdr["AccountLocked"]))
{
result = false;
}
else if (RetryAttempts == 1)
{
result = false;
}
else if (RetryAttempts > 1)
{
int AttemptsLeft = (4 - RetryAttempts);
result = true;
}
else if (Convert.ToBoolean(rdr["Authenticated"]))
{
result = true;
}
}
}
return result;
}
}
这是我的代码linq ..
public bool AuthenticateUser1(UserLogin userLogin)
{
using (HalifaxDatabaseEntities db = new HalifaxDatabaseEntities())
{
var exceeded = false;
var totalRetries = -1;
var attamp = from X in db.tblUsers
where X.Username == userLogin.Username
select X;
if (attamp.Any())
{
if (attamp.FirstOrDefault().RetryAttempts.HasValue)
{
totalRetries = attamp.FirstOrDefault().RetryAttempts;//Error on this line
exceeded = totalRetries > 4;
}
}
return exceeded;
}
}
答案 0 :(得分:2)
根据错误消息,看起来RetryAttempts
可以为n。您的代码正在尝试将其设置为int变量。
您可以将变量更改为nullable int
int? totalRetries=null;
或修复代码以包含空检查,如果它不为null,请阅读Value
属性
if (attamp.FirstOrDefault().RetryAttempts.HasValue)
{
totalRetries = attamp.FirstOrDefault().RetryAttempts.Value;
}
使用C#6 null条件运算符可以进一步简化代码。实际上你不需要totalRetries
变量,因为它是一个临时变量来派生布尔变量exceeded
的值,这就是你的方法返回的。
bool exceeded=false;
var attamp = db.tblUsers.FirstOrDefault(x=>x.UserName == userLogin.Username);
if (attamp?.RetryAttempts != null)
{
exceeded = attamp.RetryAttempts.Value> 4;
}
答案 1 :(得分:1)
您无法将类型int?
的值存储到int
类型的变量中,因为根本无法将 null 表示为整数,因此错误;要修复编译器错误,您可以执行以下操作:
totalRetries = attamp.FirstOrDefault().RetryAttempts.Value;
或:
totalRetries = attamp.FirstOrDefault().RetryAttempts ?? totalRetries;
答案 2 :(得分:1)
RetryAttempts
似乎是一个可以为空的int(int?
)。你试过这个吗?
if (attamp.FirstOrDefault().RetryAttempts.HasValue)
{
totalRetries = attamp.FirstOrDefault().RetryAttempts.Value;
exceeded = totalRetries > 4;
}
您可以在此处详细了解可空类型:https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/nullable-types/