【发布时间】:2016-11-21 05:40:51
【问题描述】:
我得到了这个在生产环境中非常慢的查询。我想知道为什么以及是否有更好的方法来实现相同的结果。
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()???您没有提供太多信息..this是什么?!Queryable()方法返回什么?显示该代码? -
对不起!代码位于存储库架构中。我在编辑部分提供了更多信息。
-
我们可能需要查看 SQL 表定义以及任何索引。
-
你能显示从调试器生成的 SQL 吗?它可能会为您提供一些见解...