linq查询超时

linq query times out

我的 Linq 查询超时并且永远不会检索到结果..

using (var repository = PersistenceService.GetRepository<Organisation>(UserId))
 {
 var organisation = repository.GetAll().FirstOrDefault(x => x.Id == organisationId);
            if (organisation != null)
            {
                        isCourseApproverRole = organisation.Contacts.FirstOrDefault(con => con.RoleName == "CourseApprover" && 
                                                            con.Individual.Id == individualId) != null;
            }
}

当我尝试在一个查询中完成所有这些时,它工作正常.. 谁能解释一下为什么上面的查询会超时??

注意:organisation.Contacts包含所选组织的大约 18,000 行。

这是因为大量延迟加载。

第一个命令...

var organisation = repository.GetAll().FirstOrDefault(x => x.Id == organisationId);

... 将 Organisation 对象拉入内存。应该没问题。

但随后您访问 organisation.Contacts。无论您将哪种 LINQ 方法应用于此集合,whole 集合都会通过延迟加载拉入内存。之后应用 LINQ 过滤器。

然而,尽管效率极低,但这仍然不会导致超时。通过索引搜索获取 18000 条记录(我假设)不应该超过 30 秒(我假设),除非出现其他严重错误(如资源不足、网络不良)。

con.Individual.Id == individualId 部分是罪魁祸首。如果您监视了已执行的 SQL 命令,您会发现这会导致对每个 Individual 进行一次查询,直到谓词 Id == individualId 匹配为止。这些查询 运行 而查询 organisation.Contacts 被读取。毫无疑问,这会导致超时。

您可以通过将谓词替换为 con.IndividualId == individualId(即使用外键 属性)来解决此问题。但我真的不明白为什么你不在一个查询中执行此操作,正如你所说,它工作正常。按照目前的方法,你获取了大量的数据,而最后你只需要一个布尔值!