我最近在查询 SQL Server 2008 的实体框架时遇到了性能问题。我设法解决了这个问题,但我不明白为什么我的修复工作有效。我正在使用带有 .Contains() 方法的 Guid 集合在 SQL 中生成 IN 子句。这是原始代码(更改表名以保护无辜者):
Guid[] values = filter.Split(',').Select<String, Guid>(d => new Guid(d)).ToArray();
returnValue = returnValue.Where(t => values.Contains(t.WorkItem.Requirement.Project.ProjectId));
当有 > 150 个 ProjectID 时,此查询需要大约 20 秒才能执行。通过更改 .Contains() 的位置,我可以大大加快速度。这是重构:
Guid[] values = filter.FilterValue.Split(',').Select<String, Guid>(d => new Guid(d)).ToArray();
var projects = from p in context.DC_DEF_Project
where values.Contains(p.ProjectId)
select p;
returnValue = from t in returnValue
join p in projects on t.DC_DEF_ProjectWorkItem.DC_DEF_ProjectRequirement.ProjectId equals p.ProjectId
select t;
此代码在与上述查询相同的数据集上花费约 0.125 秒。
我敢肯定这有一个合理的理由,但我的好奇心正在扼杀我。它是什么?