如何过滤嵌套集合Entity Framework对象?

Naz*_*gol 23 linq entity-framework filtering entity-framework-4.1

这是问题所在:我需要返回带有过滤嵌套集合的对象集合.例如:有一个带有订单的商店,我需要返回一个包含商店的集合,这些商店包含带有订单的嵌套集合,但没有标记为已删除的客户的订单.

这是我尝试做的.但仍然没有运气.任何建议值得赞赏:)

public List<StoreEntity> GetStores(Func<Store, bool> storeFilter, Predicate<OrderEntity> orderFileter)
{
    IQueryable<StoreEntity> storeEntities = Context.Stores
        .Include(o => o.Order)
        .Include(cu => cu.Orders.Select(c => c.Customer))
        .Where(storeFilter)
        //.Where(rcu=>rcu.Orders.Select(cu=>cu.Customer.Deleted==false)) //just test this doesn't work
        .AsQueryable();

    List<StoreEntity> storeEntities = storeEntities.ToList();

    //storeEntities.ForEach(s => s.Orders.ToList().RemoveAll(c=>c.Customer.Deleted==true)); // doesn't work

    foreach (StoreEntity storeEntity in storeEntities)
    {
        storeEntity.Orders.ToList().RemoveAll(r=>r.Customer.Deleted==true);
    }

    return storeEntities;
}
Run Code Online (Sandbox Code Playgroud)

问题是没有应用过滤器.已将已删除标记设置为true的客户留在集合中.

Yak*_*ych 32

你不能以"整洁"的方式直接做到这一点,但你有几个选择.
首先,您可以在获取商店后显式加载子集合.请参阅显式加载相关实体时应用过滤器部分.

如果您不想额外访问数据库,则必须构建自己的查询,并将父集合和过滤后的子集合手动投影到另一个对象上.有关示例,请参阅以下问题:
Linq To Entities - 如何筛选子实体
LINQ Query - 如何对eager fetch进行排序和筛选

编辑

顺便说一句,您的第一次.Where(rcu=>rcu.Orders.Select(cu=>cu.Customer.Deleted==false))尝试不起作用,因为这样您将过滤器应用于父集合(存储)而不是嵌套集合(例如,所有没有已删除客户的存储).
逻辑上,过滤嵌套集合的代码应该放在Include方法中.目前,Include仅支持Select声明,但我个人认为现在是EF团队实施以下内容的时候了:

.Include(cu => cu.Orders.Select(c => c.Customers.Where(cust => !cust.IsDeleted)));
Run Code Online (Sandbox Code Playgroud)

  • 我同意EF团队应该实施过滤包含.投票给它[这里](https://entityframework.codeplex.com/workitem/47)! (4认同)