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
(即使用外键 属性)来解决此问题。但我真的不明白为什么你不在一个查询中执行此操作,正如你所说,它工作正常。按照目前的方法,你获取了大量的数据,而最后你只需要一个布尔值!
我的 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
(即使用外键 属性)来解决此问题。但我真的不明白为什么你不在一个查询中执行此操作,正如你所说,它工作正常。按照目前的方法,你获取了大量的数据,而最后你只需要一个布尔值!