首页 > 解决方案 > 实体框架执行不必要的 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 = ...

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

标签: c#entity-framework

解决方案


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


推荐阅读