C# 为什么我的linq到SQL查询非常慢?

C# 为什么我的linq到SQL查询非常慢?,c#,sql,linq,C#,Sql,Linq,我得到的这个查询在生产环境中非常慢。我想知道为什么以及是否有更好的方法来达到同样的结果 public async Task<Membership> FindByEmailByAccessL1OrL3OrL4Async(string email) { return await (from m in this.Queryable() where m.Email == email &&

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

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();
}
公共异步任务findbyemailbyaccessl1orl3or4async(字符串电子邮件)
{
return wait(在this.Queryable()中来自m)
其中m.Email==电子邮件
&&(m.rolemememberships.Select(r=>r.RoleId).Contains(RoleConstants.ACCESSGRANTEDL1ID)
||选择(r=>r.RoleId).Contains(RoleConstants.ACCESSGRANTEDL3ID)
||选择(r=>r.RoleId).Contains(RoleConstants.ACCESSGRANTEDL4ID))
选择m.SingleOrDefaultAsync();
}
简而言之,此查询的目的是通过电子邮件获得用户成员资格并继续登录。我获得的用户成员越多,这个查询就会越慢

谢谢,

大卫

编辑

this.Queryable()
相当于执行
select*from Memberships
Membership
表有许多角色,并且一个角色有许多成员身份


此外,memberships表最多需要12秒来获取240行的登录信息。我必须按角色筛选,因为电子邮件值在系统中不是唯一的。只有某些角色有权登录,这些角色将具有唯一的电子邮件。这就是我必须过滤的原因。此查询返回一个成员身份以继续登录,该成员身份已通过上述查询选择。因此,没有
IQueryable
IEnumerable
List
,只有
SingleOrDefault
值。

我认为有很多数据要加载,而EF是非常慢的映射技术,可以创建有趣的查询(您可以看到这一点).您在性能方面有问题吗?也许您应该选择其他映射技术(例如stacks dapper)。当我们进行测试时,它的速度是EF的两倍。

我认为有很多数据要加载,EF的映射技术非常慢,会产生有趣的查询(你可以看到这一点)。你在性能方面有问题吗?也许你应该选择其他映射技术(例如stacks dapper)。当我们进行测试时,它比EF快两倍。

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

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();
}
公共任务findByeMailByAccessl1orl3or4Async(字符串电子邮件)
{
return(在this.Queryable()中从m返回)
其中m.Email==电子邮件
&&(m.RoleMemberships.Any)(
r=>r.RoleId==RoleConstants.ACCESSGRANTEDL1ID
||r.RoleID==RoleConstants.ACCESSGRANTEDL3ID
||r.RoleID==RoleConstants.ACCESSGRANTEDL4ID)
选择m.SingleOrDefaultAsync();
}
我想以上这些会让事情变得更好。在这两种情况下,您都可以使用调试器检查生成的查询


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

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

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();
}
公共任务findByeMailByAccessl1orl3or4Async(字符串电子邮件)
{
return(在this.Queryable()中从m返回)
其中m.Email==电子邮件
&&(m.RoleMemberships.Any)(
r=>r.RoleId==RoleConstants.ACCESSGRANTEDL1ID
||r.RoleID==RoleConstants.ACCESSGRANTEDL3ID
||r.RoleID==RoleConstants.ACCESSGRANTEDL4ID)
选择m.SingleOrDefaultAsync();
}
我想以上这些会让事情变得更好。在这两种情况下,您都可以使用调试器检查生成的查询


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

this.Queryable()
??您没有提供太多信息。
这是什么?!什么是
Queryable()
method return?显示该代码?很抱歉!该代码位于存储库体系结构中。我在编辑部分提供了更多信息。我们可能需要查看SQL表定义以及任何索引。能否显示从调试器生成的SQL?它可能会为您提供一些见解…
this.Queryable()
???您没有提供太多信息。
这是什么?!什么是
可查询()
method return?显示该代码?很抱歉!该代码位于存储库体系结构中。我在编辑部分提供了更多信息。我们可能需要查看SQL表定义以及任何索引。能否显示从调试器生成的SQL?它可能会为您提供一些见解…如何推断EF在pla中这里是y?再一次,如果我们有大数据,它不快,这就是为什么我认为这是这种情况。你如何推断EF在这里起作用?再一次,如果我们有大数据,它不快,这就是为什么我认为这是“非常波段”-你的意思是“坏”,“宽”还是其他什么?“非常波段”-你的意思是“坏”,“宽”还是别的什么?