EF Core选择特定列时是否仍需使用Include导航属性?
EF Core投影查询中是否需要保留Include语句?
完全可以直接移除Include语句,不需要保留——甚至保留Include反而会造成不必要的性能损耗,原因如下:
Include的核心作用是告知EF Core「加载完整的关联实体」,但投影查询是直接指定要返回的具体列/属性,EF Core会根据你写的
Select逻辑自动生成对应的SQL,不需要额外用Include来引导导航关系。针对你提到的「导航属性过滤」场景,过滤条件完全可以直接写在
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
相关产品推荐
相关产品推荐

