显式加载适用于先查主体、后按需补数据的场景,需主体被上下文追踪且导航属性可写,通过Load()或Query()手动触发查询,避免N+1和不必要的数据传输。
EF Core 显式加载(Explicit Loading)适用于“先查主体、后按需补数据”的场景。它不依赖自动机制,而是由开发者在获取实体后,手动触发对导航属性的数据库查询,适合控制加载时机和范围,避免不必要的数据传输。
当你已经拿到一个或多个实体(比如单个 Order),但此时还不确定是否需要它的 Customer 或 OrderItems,等业务逻辑判断后再决定加载——这时显式加载就比贪婪加载(Include)更灵活,也比延迟加载(Lazy Loading)更可控。
调用 DbContext.Entry(entity).Collection(navProp).Load() 或 .Reference(navProp).Load() 即可发起一次数据库查询,把关联数据填入导航属性。
Entry(order).Collection(o => o.OrderItems).Load()
Entry(order).Reference(o => o.Customer).Load()
:Query() 实现带过滤/排序的显式加载如果不想加载全部关联数据,而是只取满足条件的部分(例如:只加载近 30 天的订单项),就要用 Query() 替代 Load()。它返回 IQueryable
var shippedItems = context.Entry(order).Collection(o => o.OrderItems).Query().Where(oi => oi.Status == "Shipped");shippedItems.ToList() 才真正查询数据库显式加载不是“黑盒魔法”,它依赖上下文追踪和实体状态。几个关键点要记牢:
基本上就这些。用得好,显式加载是精打细算数据加载的利器;用得随意,反而增加数据库往返次数。关键在“按需”二字。