如果我只将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();
答案 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
这才是真正的问题。