[英]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行的登录信息。 我必须按角色进行过滤,因为电子邮件值在系统中不是唯一的。 只有某些角色有权登录,而那些角色将拥有唯一的电子邮件。 这就是为什么我必须过滤。 该查询返回一个成员资格以继续登录,该成员资格已在上面的查询中选择。 因此,没有IQueryable
, IEnumerable
或List
,只有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();
}
我想以上将使情况变得更好。 在这两种情况下,都可以使用调试器检查生成的查询。
还要注意,您不需要等待结果,只需返回任务,调用者就需要等待它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.