实体框架中reader()的等价函数

本文关键字:函数 框架 reader 实体 | 更新日期: 2023-09-27 17:54:20

实体框架中的reader.Read()等价于什么,可以在循环中使用,如下面的代码片段。

 public bool Login_Authentication(ref string Username, ref string Password)
    {
        try
            {                
            SqlConnection Con = new          SqlConnection(SQLDatabase_Connection.GetConnection());
            Con.Open();
            SqlCommand command = new SqlCommand("SelectLoginData", Con);
            command.CommandType = CommandType.StoredProcedure;
            SqlDataReader reader = command.ExecuteReader();
            while (reader.Read())
            {
                employeeID = reader.GetInt32(1);
                userName = reader.GetString(2);
                passWord = reader.GetString(3);
                string userType = reader.GetString(4);
                if (userName == Username && Password == passWord)
                {
                    if (userType == "admin")
                    {
                        adminLogIn();
                        break;
                    }
                    else if (userType == "employee")
                    {
                        employeeLogIn();
                        break;
                    }
                }
            }
            Con.Close();
            Con.Dispose();
        }
        catch (Exception ex)
        {}
    }

现在我有一个名为TBL_PAYROLL的表,实体框架类名为HRMSEntities。我正在做以下,但它不工作。错误消息:错误5不可调用的成员'HRMSDataAccessLayer.HRMSEntities. 'TBL_PAYROLL'不能像方法一样使用

HRMSEntities hrmsDB = new HRMSEntities();
private void calculatePayrollManagement()
    {
        using (HRMSEntities context = new HRMSEntities())
        {
            foreach (TBL_PAYROLL user in context.TBL_PAYROLL())
            {
                // for every row there would be some calculation 
                // want to get data of every row in user variable
            }
        }
    }

实体框架中reader()的等价函数

你不必这么做。实体框架处理读取SQL数据和填充实体。

using (var context = new YourContext())
{
    foreach (var user in context.SelectLoginData())
    {
        // user is an instance of User, 
        // containing all properties filled from table
    }
}

你的登录存储过程似乎有点…次优的。您只需从数据库中选择所有用户,并在代码中对它们进行比较,而完全没有利用SQL提供的功能。您似乎还将密码存储为纯文本,这是非常不可取的。

EntityFramework是一种很好的将SQL表、视图和存储过程映射到类中的方法——你不需要在SQL命令中弄得一团糟,也不需要考虑如何在SQL中处理事情。

  • 从现有的数据库创建实体模型(edmx),引入要为其创建类的表/视图。使用生成的上下文执行Linq查询。大多数时候,你不需要担心正在生成的sql,尽管如果你感兴趣,有一些工具/技术可以帮助你确保你的linq是结构化的,以产生高效的sql。

因此,例如,让我们假设EF为您生成了一个名为'myDataContext'的上下文,并且您有一个名为'Users'的类(从名为Users的表创建)。

你可以这样写linq:

var myAdmins = myDataContext.Users.Where(x=>x.UserType=="admin");

创建一个包含所有用户类型为admin的用户列表。

或者使用您的示例(但注意其他关于以纯文本形式存储密码的评论是不好的)…

    var userData = myDataContext.Users
        .Where(x=>x.UserName.Equals(userName)  
        && x.Password.Equals(passWord).FirstOrDefault();
    if (userData==null)
    {
      // there is no user with this username/password combo ...
    }
    else
    {
      if (userData.UserType=="admin")
          AdminLogin();
      else if (userData.UserType=="employee"
          EmployeeLogin();
    }

请注意这不是一个很好的例子!FirstOrDefault()确保只将一个结果返回给userData,否则它将是一个列表。但是如果你得到的用户名/密码不止一个,那么你的数据就很糟糕了!你可以'Single'要求只返回一个结果,否则抛出异常。无论如何,这只是一些linq。