You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

EF Core选择特定列时是否仍需使用Include导航属性?

EF Core投影查询中是否需要保留Include语句?

完全可以直接移除Include语句,不需要保留——甚至保留Include反而会造成不必要的性能损耗,原因如下:

  1. Include的核心作用是告知EF Core「加载完整的关联实体」,但投影查询是直接指定要返回的具体列/属性,EF Core会根据你写的Select逻辑自动生成对应的SQL,不需要额外用Include来引导导航关系。

  2. 针对你提到的「导航属性过滤」场景,过滤条件完全可以直接写在Where或者投影的子查询中,EF Core会正确解析并生成对应的Join和过滤逻辑,和Include无关。

举个实际代码对比:

原查询(带Include和导航过滤)

// 加载完整的订单、订单项及关联产品,过滤出包含高价产品的订单
var originalQuery = _context.Orders
    .Include(o => o.OrderItems)
        .ThenInclude(oi => oi.Product)
    .Where(o => o.OrderItems.Any(oi => oi.Product.Price > 100))
    .ToList();

优化后的投影查询(移除Include)

// 仅返回业务需要的字段,过滤逻辑保留,无需Include
var optimizedQuery = _context.Orders
    .Where(o => o.OrderItems.Any(oi => oi.Product.Price > 100)) // 保留导航属性过滤
    .Select(o => new 
    {
        OrderId = o.Id,
        CustomerName = o.CustomerName,
        // 仅投影符合条件的订单项的部分产品属性
        HighValueProducts = o.OrderItems
            .Where(oi => oi.Product.Price > 100)
            .Select(oi => new 
            {
                ProductName = oi.Product.Name,
                Price = oi.Product.Price
            })
            .ToList()
    })
    .ToList();

这个投影查询中,EF Core会自动生成仅包含所需列的SQL,不会加载完整的OrderItems或Product实体,性能比带Include的版本更好。

关键结论

投影查询的本质是「按需索取数据」,你只需要在Select里明确写出要的字段,EF Core会自动处理导航关系的查询,Include在这里完全是多余的,直接移除即可。

内容的提问来源于stack exchange,提问作者mohsinali1317

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 06:15:45