Linq查询返回错误。存在明确的转换

时间:2017-10-28 00:46:26

标签: c# linq wcf

我正在研究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;

            }
        }

3 个答案:

答案 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/