如何通过LINQ忽略逻辑删除的实体?

时间:2020-02-04 08:08:14

标签: c# linq entity-framework-6

我的购物车结构包含订单,订单包含订单项,订单项包含订单子项。所有这些结构还可以与逻辑删除一起使用。我在每个级别上都有一个数据删除属性。我使用实体框架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);

我也尝试过:

enter image description here

2 个答案:

答案 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-这是用于加载相关实体的文档,因为它不适用于“延迟加载”的实体。