Как игнорировать мои логические удаленные объекты с помощью LINQ? - PullRequest
0 голосов
/ 04 февраля 2020

У меня есть структура корзины, которая содержит заказы, которые содержат позиции заказа, которые содержат подпозиции заказа. Вся эта структура также работает с логическим удалением. У меня на каждом уровне есть свойство удаления данных. Я использую Entity Framework 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);

Затем, чтобы удалить все мои удаленные элементы, я делаю это l oop:

            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 l oop. поэтому я уже изменил все это на простой для classi c l oop.

Теперь мой вопрос: возможно ли выполнить это в одном симпатичном 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 голосов
/ 04 февраля 2020

В вашем Context, в методе OnModelCreating:

modelBuilder.Entity<YourClass>().HasQueryFilter(p => !p.IsDeleted);
0 голосов
/ 04 февраля 2020

РЕДАКТИРОВАТЬ: Вы можете использовать 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 - вот документация для загрузки связанных сущностей, потому что она не работает для сущностей, которые являются «отложенными загрузками».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...