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)
| 归档时间: |
|
| 查看次数: |
52103 次 |
| 最近记录: |