当所有数据都已存储在内存中时,Entity Framework执行不必要的SQL查询吗?

时间:2018-10-25 10:04:07

标签: c# entity-framework

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 = ...

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

2 个答案:

答案 0 :(得分:1)

当Entity Framework加载跟踪的对象时,它将它们添加到可以通过context.Table.Local访问的本地存储库中。在本地存储库之外运行查询将始终转换为SQL,并将在数据库引擎上运行。话虽这么说,但我确实认为在您的情况下使用带有联接的组合查询更为合适。

答案 1 :(得分:1)

在不假设它是唯一实例的情况下,EF应该如何知道所有数据都已加载到内存中,而数据库中还没有创建其他数据呢?

那是核心问题。 EF没有对此做任何假设,这就是为什么它进行另一个查询。两者之间有时间。