我使用ASP NET MVC
4.5和EF6
,代码优先迁移。EF LINQ ToList非常慢
我有这个代码,大约需要6秒。
var filtered = _repository.Requests.Where(r => some conditions); // this is fast, conditions match only 8 items
var list = filtered.ToList(); // this takes 6 seconds, has 8 items inside
我认为这是因为关系的,它必须建立他们的内部内存,但事实并非如此,因为甚至当我返回0领域,它仍然是慢。
var filtered = _repository.Requests.Where(r => some conditions).Select(e => new {}); // this is fast, conditions match only 8 items
var list = filtered.ToList(); // this takes still around 5-6 seconds, has 8 items inside
现在请求表是相当复杂的,大量的关系,并拥有16K〜项目。另一方面,过滤的列表应该只包含8个项目的代理。
为什么ToList()
方法这么慢?我实际上认为问题不在于ToList()方法,但可能是EF问题,或者设计问题不好。
任何人都有过这样的经验吗?
编辑:
这些条件:
_repository.Requests.Where(r => ids.Any(a => a == r.Student.Id) && r.StartDate <= cycle.EndDate && r.EndDate >= cycle.StartDate)
所以基本上,我可以,如果Student
ID是我的ID列表检查和检查,如果日期匹配。
你是否在'some condition'中使用了任何导航属性,因为它导致了sql方面的连接? – dotctor 2014-11-04 11:00:22
作为@HamidP的附加,是否将您的导航属性标记为“虚拟”?否则,他们会立即加入,而不是延迟加载(纠正我,如果我错了。) – Marthijn 2014-11-04 13:18:29
是的,他们都是虚拟的。 – Jaanus 2014-11-04 13:23:00