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