繁体   English   中英

为什么我的linq to SQL查询非常慢?

[英]Why is my linq to SQL query very slow?

我得到的查询在生产环境中非常慢。 我想知道为什么以及是否有更好的方法来达到相同的结果。

public async Task<Membership> FindByEmailByAccessL1OrL3OrL4Async(string email)
{
    return await (from m in this.Queryable()
                  where m.Email == email
                        && (m.RoleMemberships.Select(r => r.RoleId).Contains(RoleConstants.ACCESSGRANTEDL1ID)
                            || m.RoleMemberships.Select(r => r.RoleId).Contains(RoleConstants.ACCESSGRANTEDL3ID)
                            || m.RoleMemberships.Select(r => r.RoleId).Contains(RoleConstants.ACCESSGRANTEDL4ID))
                  select m).SingleOrDefaultAsync();
}

简而言之,此查询的目的是通过电子邮件获取用户成员身份并继续登录。 我获得的用户成员资格越多,查询速度将越慢。

谢谢,

大卫

编辑

this.Queryable()等同于select * from Memberships中进行select * from Memberships Membership表具有许多角色,并且一个角色具有许多成员资格。

此外,成员资格表最多需要12秒才能获得240行的登录信息。 我必须按角色进行过滤,因为电子邮件值在系统中不是唯一的。 只有某些角色有权登录,而那些角色将拥有唯一的电子邮件。 这就是为什么我必须过滤。 该查询返回一个成员资格以继续登录,该成员资格已在上面的查询中选择。 因此,没有IQueryableIEnumerableList ,只有SingleOrDefault值。

我认为生成的查询非常糟糕,因为您多次执行相同的操作,即:

m.RoleMemberships.Select(r => r.RoleId)

相反,您可以使用以下方法执行一次操作:

public Task<Membership> FindByEmailByAccessL1OrL3OrL4Async(string email)
{
    return (from m in this.Queryable()
            where m.Email == email
              && (m.RoleMemberships.Any(
                    r => r.RoleId == RoleConstants.ACCESSGRANTEDL1ID 
                      || r.RoleID == RoleConstants.ACCESSGRANTEDL3ID 
                      || r.RoleID == RoleConstants.ACCESSGRANTEDL4ID)
            select m).SingleOrDefaultAsync();
}

我想以上将使情况变得更好。 在这两种情况下,都可以使用调试器检查生成的查询。

还要注意,您不需要等待结果,只需返回任务,调用者就需要等待它。

我认为有很多数据的加载和EF是很慢的测绘技术,创造有趣的查询(你可以看到这个在这里 )。做你有性能问题?也许你应该选择其他映射技术(栈短小精悍例如精致小巧 ) 。 当我们进行测试时,它比EF快两倍。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM