Entity Framework中 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
}
}
}
答案 0 :(得分:1)
你不必。实体框架处理读取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提供的功能。您似乎也将密码存储为纯文本,这是不可取的。
答案 1 :(得分:1)
EntityFramework是将SQL表,视图和存储过程映射到类中的一种很好的方法 - 你不需要乱用sql命令,或者考虑如何在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,否则它将是一个列表。但是,如果您使用该用户名/密码返回的用户不止一个,那么您的数据将会非常糟糕!您可以“单个”要求只返回一个结果,否则抛出异常。但无论如何,这只是一些linq的品尝者。