c# - 实体框架执行不必要的 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 = ...
我从前两个查询中假设所有数据都已加载,那么为什么要在数据库中运行新查询呢?
解决方案
当 Entity Framework 加载被跟踪的对象时,它会将它们添加到本地存储库中,可以通过context.Table.Local
. 在本地 repo 之外运行查询将始终转换为 SQL,并将在数据库引擎上运行。话虽这么说,我确实认为与联接的组合查询更适合您的情况。
推荐阅读
- html - 下拉菜单中奇怪的悬停样式
- php - WP minimum Quantity at single product page
- tfs - TFS 2018 - PROJECT MAPPING
- javascript - fastest way to add a click handler to elements being added to the dom
- javascript - Reduce single array containing objects that may or may not have same value into an array of single unique objects
- javascript - Encoding URL vars in HREF versus onclick using JS window.location
- python - Django: How to create a dynamic related_name for an inherited parent model?
- angular - '{ headers: Headers; 类型的参数 }' 不可分配给参数:Ionic
- android - Intent to Dial Pad and SMS APP are loading the wrong numbers
- angular - Angular 2父路径替换为子路径