1

如果我只传递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();
4

3 回答 3

1

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

于 2012-12-03T13:15:17.673 回答
1

您是否无法获得以下评估的 ID:

s.ANOTHER_ENTITY.FirstOrDefault().ID

即int?anotherEntityId = s.ANOTHER_ENTITY.FirstOrDefault().ID;

并使用它代替上面的代码行。

正如我认为将它包含在 where 子句中很可能(取决于用于获取该实体的 ef 查询)导致最终的 sql 查询变得一团糟。

至少我认为它值得测试。

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

s.ANOTHER_ENTITY.FirstOrDefault().ID

这才是真正的问题。

于 2012-12-03T13:25:07.640 回答
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();

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

于 2012-12-03T13:18:38.310 回答