EF Core中带Select转换的筛选Include失效问题
问题原因
EF Core中,带筛选条件的Include仅作用于实体对象的导航属性加载——也就是当你直接查询Order实体时,它会帮你过滤关联的OrderItems。但一旦使用Select进行投影转换为DTO,EF Core会完全基于你写的Select表达式生成SQL查询,此时Include的筛选规则会被直接忽略,因为投影逻辑是独立的,不会继承Include的过滤条件。
正确实现方式
不需要依赖Include,直接在投影的Items部分添加筛选条件即可:
var ordersDtoAbove100 = context.Orders .Select(m => new OrderDto() { CustomerName = m.CustomerName, Id = m.Id, OrderDate = m.OrderDate, Items = m.OrderItems.Where(item => item.Price > 100) .Select(item => new OrderItemDto() { Price = item.Price, ProductName = item.ProductName, Quantity = item.Quantity, }) }) .AsNoTracking() .ToList();
如果需要复用筛选逻辑,可单独提取表达式:
Expression<Func<OrderItem, bool>> priceAbove100Filter = item => item.Price > 100; var ordersDtoAbove100 = context.Orders .Select(m => new OrderDto() { CustomerName = m.CustomerName, Id = m.Id, OrderDate = m.OrderDate, Items = m.OrderItems.Where(priceAbove100Filter) .Select(item => new OrderItemDto() { Price = item.Price, ProductName = item.ProductName, Quantity = item.Quantity, }) }) .AsNoTracking() .ToList();
内容的提问来源于stack exchange,提问作者ClemB
相关产品推荐
相关产品推荐

