有人可以建议我这个查询有什么问题吗?如何提高性能并减少执行时间?
IQueryable<Mapper> query = null;
query = (from c in entities.Users
where c.UserEmailAddress == emailAddress
&& c.UserPassword == password
&& c.IsAccountVerified == true
select new Mapper()
{
UserId= c.UserID,
Name = c.UserName
});
custObj = query.ToList<Mapper>().FirstOrDefault();
我正在使用EF Profiler,它会在警告后提醒我: -
供参考: -
即使在本地,我注意到它需要2-4秒才能执行?
除此之外,是否有人可以建议使用指南来微调EF中的查询。
我使用的是EF6.0
答案 0 :(得分:1)
我认为问题在于您使用了不必要的复杂查询,因为 EmailAddress 可能是唯一的。现在您要检查三个条件来选择您的记录,但仅使用电子邮件地址应该足够了。我宁愿选择基于 EmailAddress 的用户(可能 IsAccountVerified ),然后在代码中检查密码哈希。
代码将是这样的(我还没有检查过):
var user = entities.Users.FirstOrDefault(u => u.EmailAddress == emailAddress)
Mapper custObj = null;
if(user != null && user.IsAccountVerified && user.Password == password)
custObj = new Mapper
{
UserId = user.UserID,
Name = user.UserName
};
现在您没有对非索引列进行查询,结果将是相同的。
我检查了MS SQL数据库上的simillar案例。使用索引列基于一个条件进行选择很好地提升了查询(在我的情况下为0ms而不是13ms)。