我的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行。
答案 0 :(得分:1)
这是因为大量的延迟装载。
第一个命令......
var organisation = repository.GetAll().FirstOrDefault(x => x.Id == organisationId);
...将Organisation
对象拉入内存。这不应该是任何问题。
然后你访问organisation.Contacts
。无论您将哪种LINQ方法应用于此集合,都会通过延迟加载将整个集合拉入内存。之后应用LINQ过滤器。
然而,虽然效率很低,但仍然不应该导致超时。通过索引搜索获取18000条记录(我假设)不应超过30秒(我假设),除非其他方面非常错误(如资源不足,网络不良)。
部分con.Individual.Id == individualId
是罪魁祸首。如果您已经监视执行的SQL命令,那么您已经看到这会导致每个Individual
一个查询,直到谓词Id == individualId
匹配为止。读取查询organisation.Contacts
时会运行这些查询。毫无疑问,这会导致超时。
您可以通过con.IndividualId == individualId
替换谓词(即使用外键属性)来解决此问题。但是我真的不明白你为什么不在一个查询中执行此操作,正如你所说的那样。通过当前的方法,您可以获取大量数据,而最终只需要一个布尔值!