我正在使用 ASP NET MVC
4.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
我以为这是因为关系,它必须在内存中构建它们,但事实并非如此,因为即使我返回 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
现在 Requests 表非常复杂,有很多关系并且有大约 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 列表中,并检查日期是否匹配。
最佳答案
您的filtered
变量包含一个question 查询,但不包含answer。如果您通过调用 .ToList()
请求答案,那是在执行查询时。这就是它速度慢的原因,因为只有当您调用 .ToList()
时,您的数据库才会执行查询。
它被称为延迟执行。 A google可能会为您提供更多相关信息。
如果您展示了您的一些条件,我们也许可以说出为什么它很慢。
关于c# - EF LINQ ToList 非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26733248/