[asp.net-mvc]linq 查询超时

标签: Asp.net-MVC Linq
发布时间: 2017/3/25 10:40:19
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

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

当我试着做这一切在一个查询中它的优良工程。 一些人可以解释为什么上面的查询将会超时??

注︰ 组织。联系人包含所选组织约 18,000 行。

解决方法 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 (即使用外键属性)。但我真的不明白为什么你不在一个查询中,可以正常工作,你说这样做。由目前的办法你获取大量的数据,而最后你只需要一个布尔值 !

赞助商