EF查询性能问题

时间:2012-12-03 13:12:57

标签: c# asp.net entity-framework

如果我只将createdFromDate传递给下面的lambda,我的查询大约需要300毫秒。但如果我通过id参数,我最终会在20-30秒内结束。有没有办法在传递id变量时改进查询?

List<MYENTITY> list= ctx.MYENTITY.Where(s => 
      (string.IsNullOrEmpty(createdFrom) || s.CREATE_DATE >= createdFrom) && 
      (string.IsNullOrEmpty(id) || s.ANOTHER_ENTITY.FirstOrDefault().ID == id)
      .ToList();

3 个答案:

答案 0 :(得分:1)

我怀疑这不是EF的错。我要做的是捕获EF生成的查询,将其粘贴到SSMS中并查看查询计划。我的猜测是正在进行表或索引扫描,因为缺少索引。或者,索引存在但未被使用,可能是因为索引中应包含一个或多个列。

答案 1 :(得分:1)

尝试一件简单的事情:

List<MYENTITY> list = ctx.MYENTITY.Where(s => 
  string.IsNullOrEmpty(createdFrom) || s.CREATE_DATE >= createdFrom)
  .ToList()
  .Where(s2 => string.IsNullOrEmpty(id) || s2.ANOTHER_ENTITY.FirstOrDefault().ID == id)
  .ToList();

这不是一个解决方案,但如果它加快了速度,那么我建议查看你的代码,如果速度保持不变,我建议你查看你的数据库结构。

答案 2 :(得分:1)

你不能得到评估的ID:

s.ANOTHER_ENTITY.FirstOrDefault().ID

即。诠释? anotherEntityId = s.ANOTHER_ENTITY.FirstOrDefault()。ID;

用它代替上面的代码行。

因为我认为在where子句中包含它实际上很可能(取决于用于获取此实体的ef查询)导致最终的sql查询成为一团糟。

至少我认为值得测试。

那就是你可以将anotherEntityId替换为某个已知值并进行测试,如果它很慢那么它就是

的评估
s.ANOTHER_ENTITY.FirstOrDefault().ID

这才是真正的问题。