EFLINQToListisveryslow我正在使用ASPNETMVC4.5和EF6,代码是第一次迁移。我有这段代码,大约需要6秒。varfiltered=_repository.Requests.Where(r=>一些条件);//这很快,条件只匹配8个项目varlist=filtered.ToList();//这需要6秒,里面有8个项目我认为这是因为关系,它必须在内存中构建它们,但事实并非如此,因为即使我返回0个字段,它仍然很慢。varfiltered=_repository.Requests.Where(r=>someconditions).Select(e=>new{});//这很快,条件只匹配8个项目varlist=filtered.ToList();//这仍然需要大约5-6秒,里面有8个项目,现在请求表非常复杂,有很多关系,大约有16k个项目。另一方面,过滤后的列表应该只包含8项代理。为什么ToList()方法这么慢?我实际上不认为问题出在ToList()方法上,而可能是EF问题或设计问题。有人有这方面的经验吗?编辑:这些是条件:_repository.Requests.Where(r=>ids.Any(a=>a==r.Student.Id)&&r.StartDate=cycle.StartDate)基本上,我可以检查学生ID在我的id列表中并检查日期是否匹配。除了Maarten的回答之外,我认为问题在于有两种不同的情况有些情况很复杂,导致数据库中的复杂和繁重的连接或查询有些情况正在过滤未索引的列,这会导致全表扫描并使查询变慢。我建议开始监控EntityFramework生成的查询,这很简单,你只需要设置上下文的Log函数并查看结果,使用(varcontext=newMyContext()){context.Database.Log=Console。写;//你的代码在这里...}如果你在生成的查询中看到一些奇怪的东西,试着通过分解它来让它变得更好,有时实体框架生成的查询并不是那么好。如果查询正常,则问题出在您的数据库中(假设没有网络问题)。使用SQLProfiler运行查询并检查错误。更新我建议您:在表中的StartDate和EndDate列上添加索引(每个列一个,而不是两个)您的过滤变量包含查询的问题,但不包含答案。如果通过调用.ToList()请求答案,那就是执行查询的时间。这就是为什么它很慢,因为只有当你调用.ToList()时,数据库才会执行查询。这称为延迟执行。Google可能会为您提供更多信息。如果您显示一些条件,我们也许可以说出为什么它很慢。ToList执行对DB的查询,而第一行不执行。你能在这里显示一些条件代码吗?为了提高性能,您需要优化查询/在数据库表上创建索引。您的第一行代码只返回IQueryable。这是您要运行的查询的表示,而不是查询的结果。当您在IQueryable上调用.ToList()时,查询本身仅在数据库上运行,因为这是您实际请求数据的第一个点。您添加的.Select调整只会添加到现有的IQueryable查询定义中。它不会改变必须执行的条件。您基本上更改了以下内容,您将获得8条记录:select*fromRequestswhere[someconditions];类似于:从[某些条件]的请求中选择“”;您仍然必须使用条件执行完整查询,但对于每条记录您只需要一个空字符串,因此您将得到8个空字符串。这个问题的长期和短期是,您遇到的任何性能问题都来自您的“特定条件”。没有看到他们,很难知道。但我在过去看到人们在调用.ToList()之前添加。循环中的子句,无意中创建了一个非常复杂的查询。亚努斯。此问题最可能的原因是EntityFramework生成的SQL查询的强制转换。我猜您的过滤条件包含对其他一些表的检查。尝试通过“SQLServerProfiler”检查生成的查询。然后将此查询复制到“ManagementStudio”并检查“估计的执行计划”。通常,ManagementStudio会根据您的查询生成索引建议,请尝试遵循它们。以上就是C#学习教程的全部内容:EFLINQToList分享的很慢。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处:
