EF LINQ ToList非常慢

Jaa*_*nus 2 .net c# linq entity-framework ef-code-first

我正在使用ASP NET MVC4.5和EF6代码优先迁移.

我有这个代码,大约需要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
Run Code Online (Sandbox Code Playgroud)

我认为这是因为关系,它必须在内存中构建它们,但事实并非如此,因为即使我返回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
Run Code Online (Sandbox Code Playgroud)

现在请求表非常复杂,关系很多并且有大约16k项.另一方面,筛选后的列表应该只包含8个项目的代理.

为什么ToList()方法这么慢?我实际上认为问题不在ToList()方法中,但可能是EF问题,或者设计问题不好.

有没有经历过这样的事情?

编辑:

这些是条件:

_repository.Requests.Where(r => ids.Any(a => a == r.Student.Id) && r.StartDate <= cycle.EndDate && r.EndDate >= cycle.StartDate)
Run Code Online (Sandbox Code Playgroud)

所以基本上,我可以检查Studentid是否在我的id列表中并检查日期是否匹配.

Maa*_*ten 6

您的filtered变量包含一个问题的查询,但它不包含答案.如果您通过调用请求答案.ToList(),那就是执行查询时.这就是为什么它很慢的原因,因为只有当你调用时.ToList()才是数据库执行的查询.

它被称为延迟执行.谷歌可能会给你一些关于它的更多信息.

如果您展示了一些条件,我们可能会说出它为什么会变慢.