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 = ...
我从前两个查询中假设所有数据都已加载,那么为什么要在数据库中运行新查询?
答案 0 :(得分:1)
当Entity Framework加载跟踪的对象时,它将它们添加到可以通过context.Table.Local
访问的本地存储库中。在本地存储库之外运行查询将始终转换为SQL,并将在数据库引擎上运行。话虽这么说,但我确实认为在您的情况下使用带有联接的组合查询更为合适。
答案 1 :(得分:1)
在不假设它是唯一实例的情况下,EF应该如何知道所有数据都已加载到内存中,而数据库中还没有创建其他数据呢?
那是核心问题。 EF没有对此做任何假设,这就是为什么它进行另一个查询。两者之间有时间。