我的购物车结构包含订单,订单包含订单项,订单项包含订单子项。所有这些结构还可以与逻辑删除一起使用。我在每个级别上都有一个数据删除属性。我使用实体框架6.2.4
所以我有C-O-OI-OSI
这是我的代码,可获取具有所有结构的购物车:
var cart = Context.Cart
.AsNoTracking()
.Include(y => y.Orders.Select(z => z.OrderItems.Select(x => x.OrderSubItems)))
.SingleOrDefault(y => y.Code == cartCode);
然后删除所有删除的元素,然后执行此循环:
foreach (var order in cart.Orders)
{
if (order.DateDelete != null)
{
Context.Entry(order).State = EntityState.Detached;
cart.Orders.Remove(order);
}
else
{
foreach (var orderItem in order.OrderItems)
{
if (orderItem.DateDelete != null)
{
Context.Entry(orderItem).State = EntityState.Detached;
order.OrderItems.Remove(orderItem);
}
else
{
foreach (var orderSubItem in orderItem.OrderSubItems)
{
if (orderSubItem.DateDelete != null)
{
Context.Entry(orderSubItem).State = EntityState.Detached;
orderItem.OrderSubItems.Remove(orderSubItem);
}
}
}
}
}
}
首先,是的,我得到一个异常,因为我正在修改我的foreach循环的集合。所以我已经将所有这些更改为简单的经典循环。
现在我的问题是:是否可以在一个简单的LINQ查询中执行此操作。我尝试了很多事情,但没有任何工作可做。
让我以不同的方式解释我想要的东西:
var cart = Context.Cart
.AsNoTracking()
.Include(y => y.Orders) // where DateDelete == null
.Include(y => y.Orders.Select(z => z.OrderItems)) // where DateDelete == null
.Include(y => y.Orders.Select(z => z.OrderItems.Select(x => x.OrderSubItems))) // where DateDelete == null
.SingleOrDefault(y => y.Code == cartCode);
我也尝试过:
答案 0 :(得分:0)
在您的Context
中,在OnModelCreating
方法中:
modelBuilder.Entity<YourClass>().HasQueryFilter(p => !p.IsDeleted);
答案 1 :(得分:-1)
编辑: 您可以使用Load()而不是Include()。然后您的代码将如下所示:
var cart = Context.Cart
.AsNoTracking()
.SingleOrDefault(y => y.Code == cartCode);
Context.Entry(cart).Collection(u=>u.Orders).Query().Where(x=>x.DateDelete == null).Load();
https://docs.microsoft.com/en-us/ef/ef6/querying/related-data-这是用于加载相关实体的文档,因为它不适用于“延迟加载”的实体。