【问题标题】:linq query times outlinq 查询超时
【发布时间】:2016-01-17 02:35:12
【问题描述】:

我的 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;
            }
}

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

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

【问题讨论】:

  • 看看生成的SQL语句就知道了。
  • 打开 sql profilere 然后运行您的项目检查生成的 sql 查询类型,您可以更改您的 sql 查询

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


【解决方案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 来解决此问题(即使用外键属性)。但我真的不明白你为什么不在一个查询中这样做,正如你所说,这很好。通过当前的方法,您获取大量数据,而最终您只需要一个布尔值!

【讨论】:

  • 谢谢,我设法在一个查询中完成了这项工作,但是询问了问题以了解查询中的罪魁祸首。此外,您关于在联系人表中使用外键属性的commnet 是有用,在我的情况下这是罪魁祸首..感谢您的识别。
猜你喜欢
  • 2016-08-30
  • 1970-01-01
  • 2011-07-23
  • 1970-01-01
  • 2017-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多