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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 04:39:53