如何在Entity framework 6.0中改进此查询?

时间:2015-10-16 15:21:24

标签: asp.net-mvc entity-framework sql-server-2012

有人可以建议我这个查询有什么问题吗?如何提高性能并减少执行时间?

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,它会在警告后提醒我: -

  1. 查询未编制索引的列
  2. 列类型不匹配
  3. 每个请求多个会话
  4. 供参考: -

    • EmailAddress - varchar(50) - Non ClusteredIndex
    • 密码 - varchar(最大) - 无索引
    • IsAccountVerified - bool - 无索引

    即使在本地,我注意到它需要2-4秒才能执行?

    除此之外,是否有人可以建议使用指南来微调EF中的查询。

    我使用的是EF6.0

1 个答案:

答案 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)。