实体框架在内存中已提取所有数据时执行不必要的 SQL 查询?


var logs = myContext.Logs.Where(x => ...).ToList();
var objectIds = logs.Select(x => x.ObjectId).Distinct().ToArray();
var objects = myContext.MyObjects.Where(x => objectIds.Contains(x.ID)).ToList();
foreach (MyObject myObject in objects)
{
myObject.Logs = logs.Where(x => x.ObjectId == myObject.ID).ToList();
}

当我查看生成的查询时,我有:

SELECT * FROM LOGS WHERE ...

SELECT * FROM MYOBJECTS WHERE ID IN (...)

这就是我想要的,但我对之后的每次迭代都有一个不必要的查询

SELECT * FROM LOGS WHERE OBJECTID = ...

我假设从前两个查询中加载了所有数据,那么为什么要在数据库中运行新查询呢?

当实体框架加载跟踪的对象时,它会将它们添加到可以通过context.Table.Local访问的本地存储库中。在本地存储库之外运行查询将始终转换为 SQL,并将在数据库引擎上运行。话虽如此,我确实认为与联接的组合查询更适合您的情况。

在不假设它是唯一处理它的实例的情况下,EF 如何知道所有数据都加载到内存中,并且数据库中没有创建其他数据?

这是核心问题。EF 不会对此做出假设,这就是它进行另一个查询的原因。中间有时间。

最新更新