EF是否从Db获取所有数据,然后执行过滤



我首先将一个Ado.net应用程序转换为EFcode。但我觉得EF相当慢。

示例

Ado.net代码,用于检查用户登录的密码

string strsql = "select Id from Users where UserName = '" + txtUserName.Text.trim() + "' and Password = "" + txtPassword.text.trim() + "'";
DataTable dt=dab.Fill(strsql,CommandType.Text).Tables[0];;
if(dt.Rows.Count > 0)
{
LogInID= dt.Rows[0]["Id"].ToString();
}

EF代码

LogInID= UnitOfWork.UsersRepository.Entities.Where(x => x.UserName  ==  txtUserName.Text && x.Password   ==  txtPassword .Text ).Select(x => x.Id).FirstOrDefault();

第二个代码非常慢。EF在筛选之前从Db中提取所有数据吗?或者还有什么问题吗?

编辑:

我的GenericRepository显示在下方

public class GenericRepository<TEntity> : IRepository<TEntity> where TEntity : class
{
public DbContext _dbContext;
DbSet<TEntity> dbSet;
public GenericRepository(DbContext dbContext)
{
this._dbContext = dbContext;
this.dbSet = _dbContext.Set<TEntity>();
}
public IQueryable<TEntity> Entities
{
get { return dbSet; }
}
}

在工作单元中

private IRepository<Users> _UsersRepository;
public IRepository<Users> UsersRepository
{
get
{
if (this._UsersRepository == null)
{
this._UsersRepository = new CouponRepository<Users>(_dbContext);
}
return _UsersRepository;
}
}

否,实体框架不会加载所有行,除非你告诉它,或者你将DbSet转换为IEnumerable,上面的代码建议可能就是这样。

我会看看UnitOfWork.UsersRepository.Entities,看看它在做什么。因为此代码不应与实体框架一起使用:

.Where(x => x.UserName == txtUserName.Text.trim() 
&& x.Password == txtPassword.Text.trim())

这两个trim函数(首先,该函数可能应该是trim())应该生成一个实体框架错误,显示

"LINQ to Entities不识别方法"System.String Trim()"方法,并且此方法无法转换为存储表达式"。

如果不是,则表明数据集在处理之前已转换为IEnumerable,这意味着它将返回所有行。

顺便说一句,这里有许多非常严重的安全缺陷。你的ado代码有sql注入漏洞,可能会导致你的系统被恶意软件所拥有,而且你显然是在用明文存储密码,因为你在进行直接比较。。这意味着,在你的数据库被破坏后,攻击者现在有了用户名和明文密码,他们可以用来攻击其他网站上的用户,希望他们在其他地方使用相同的用户名和密码。

否,EF没有。实体框架在获取数据时,动态地构造一个SQL查询,该查询将在返回数据之前在数据库服务器上执行。这意味着过滤将由数据库服务器而不是EF应用。

我建议您确保关闭延迟加载,因为众所周知,延迟加载会带来性能问题。

最新更新