linq查询超时

时间:2015-10-18 20:10:16

标签: asp.net-mvc linq c#-4.0 linq-to-sql

我的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行。

1 个答案:

答案 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替换谓词(即使用外键属性)来解决此问题。但是我真的不明白你为什么不在一个查询中执行此操作,正如你所说的那样。通过当前的方法,您可以获取大量数据,而最终只需要一个布尔值!