我得到了这个查询,在生产环境中非常慢。我想知道为什么以及是否有更好的方法来达到同样的结果。为什么我的linq到SQL查询很慢?
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
的等价物。 Membership
表有许多角色,并且角色有许多成员。
此外,成员资格表最多需要12秒才能获取240行的登录信息。我必须按角色过滤,因为系统中的电子邮件值不是唯一的。只有一些角色才能访问登录,并且这些角色将拥有唯一的电子邮件。这就是为什么我必须过滤。此查询返回一个成员资格以继续进行登录,该查询通过上面的查询进行选择。所以没有IQueryable
,IEnumerable
或List
,只是SingleOrDefault
值。
'this.Queryable()'???你不提供太多的信息..什么是“这个”? Queryable()方法返回什么?显示该代码? – user3185569
对不起!代码位于存储库架构内。我在编辑部分提供了更多信息。 –
我们可能需要查看SQL表定义以及任何索引。 – RBarryYoung