Удаление диапазона элементов из списка без зацикливания

Привет, есть ли более изящный способ сделать это, должен ли я сделать цикл, как функция диапазона, я мог бы просто удалить все найденные элементы

Извините, я должен был показать, как вставляется мой qry.

Кстати, это две разные сущности, которые я удаляю, надеюсь, вы уловили идею.

var qry = db.AssemblyListItems.AsNoTracking().Where(x => 
x.ProductionPlanID == (long)_currentPlan.ProductionPlan ).ToList();

var hasbeenAssembled = db.CompletedPrinteds.AsNoTracking().Where(x =>
x.ProductionPlanId == item.ProductionPlanID).ToList();

var hasbeenFound = db.CompletedPrinteds.AsNoTracking().Where(x => 
x.ProductionPlanId== item.ProductionPlanID).ToList();

foreach (var subitem in hasbeenAssembled )
{
  if(item.ProductionPlanID ==subitem.ProductionPlanId && item.DocumentNo == subitem.DocumentNo && item.DocumentNo == subitem.DocumentNo && item.OutstandingToMake ==0)
    {
      qry.RemoveAll(x => x.ProductionPlanID == subitem.ProductionPlanId && x.DocumentNo == item.DocumentNo && x.ItemCode == subitem.StockCode && item.OutstandingToMake ==0);                   

    }
}

public List<AssemblyListItems>  RemoveDespatchedItems(List<AssemblyListItems> AssemblyItems)
{       
        foreach (AssemblyListItems item in AssemblyItems)
        {
            using (var db = new LiveEntities())
            {
                var hasNotBeenDespatched = db.PalletizedItems.Where(w => w.Despatched != "Not Despatched");
                foreach (var subitem in hasNotBeenDespatched)
                {
               AssemblyItems.RemoveAll(x => x.ProductionPlanID == subitem.ProductionPlanID && x.DocumentNo == item.DocumentNo && x.ItemCode == subitem.StockCode);
                }


            }
        }
        return AssemblyItems;
}

Мне просто нужно удалить элементы из первого запроса hasNotBeenDespatched из второго запроса. Как и более 400 элементов, я хочу, чтобы он был максимально эффективным.

Редактировать 2 Я немного ближе, спасибо, но он все еще не удаляет элементы из removedespatchitems из сборки, я не знаю, почему

public List<AssemblyListItems> RemoveDespatchedItems(List<AssemblyListItems> AssemblyItems, Int64 ProductionPlanId)
{
   using (var db = newLiveEntities())
   {
            List<PalletizedItems> removeDespatchItems = db.PalletizedItems.Where(w => w.Despatched != "Not Despatched" && w.ProductionPlanID == ProductionPlanId).ToList();

            var itemsDocumentNo = db.PalletizedItems.Select(x => x.ProductionPlanItemID).ToList();        
            foreach (var subitem in removeDespatchItems)  {                 

                AssemblyItems.RemoveAll(x => x.ProductionPlanID == subitem.ProductionPlanID && itemsDocumentNo.Contains(x.ProductionPlanItemID) && x.ItemCode == subitem.StockCode && x.LineQuantity==x.AllocatedQuantity);

        }
    }

        return AssemblyItems;
}

Возможный дубликат Удалить элементы из одного списка в другой

JohnLBevan 31.10.2018 12:04

@JohnLBevan, я прошу также более элегантный способ выполнения цикла.

david 31.10.2018 12:05

@JohnLBevan и объекты не совпадают, поэтому работать не будет.

david 31.10.2018 12:06

Ах, извинения; закрытие голосования отозвано.

JohnLBevan 31.10.2018 12:08

Будет ли кроме работы? docs.microsoft.com/en-us/dotnet/api/…

Luke Baughan 31.10.2018 12:08

@bUKaneer Не думайте, потому что это два разных списка сущностей.

david 31.10.2018 12:10

Чрезвычайно сложно понять, чего вы пытаетесь достичь. Например, неясно, как RemoveDespatchedItems связан с кодом над ним. В любом случае не стоит строить список, а затем удалять из него элементы. Создайте его один раз, исключая элементы по тем же критериям, которые вы используете позже для их удаления. Другими словами: разверните первое предложение Where.

Gert Arnold 01.11.2018 21:53
0
7
97
1

Ответы 1

Не на 100%, я понимаю, как должно быть.

Однако в целом вы можете использовать join, что приведет к тому, что это будет сделано в базе данных. Что-то вроде этого:

var remainingItems = (from ali in db.FUEL_AssemblyListItems
            join completed in db.FuelCompletedPrinteds 
                on new { ali.ProductionPlanID, ali.DocumentNo, ali.ItemCode } equals new { completed.ProductionPlanID, completed.DocumentNo, completed.StockCode }
            join dispatched in db.FUEL_PalletizedItems
                on new { ali.ProductionPlanID, ali.DocumentNo, ali.ItemCode } equals new { dispatched.ProductionPlanID, dispatched.DocumentNo, dispatched.StockCode }
            where (ali.ProductionPlanID == (long) _currentPlan.ProductionPlan
                && ali.DocumentNo == completed.DocumentNo
                && completed.OutstandingToMake == 0
                && dispatched.Despatched != "Not Despatched")
            select ali).ToList();

В зависимости от записей в базе данных соединение может быть внешним соединением, которое требует немного другого синтаксиса, но, надеюсь, у вас есть отправная точка.

Также необходимо учитывать Не отправлено в другой таблице.

david 31.10.2018 13:03

Добавлено не отправлено, однако я не уверен, как они должны работать вместе, поскольку методы, похоже, не вызывают друг друга, однако подход к объединению все еще сохраняется. В зависимости от того, что нужно вернуть, предложение where, вероятно, требует настройки.

PhilS 31.10.2018 14:18

он сказал, что соединение было незаконным

david 31.10.2018 15:15

Не могли бы вы уточнить. Говорится, почему это незаконно? Также было бы полезно, если бы вы могли предоставить подробную информацию о схеме базы данных.

PhilS 31.10.2018 15:20

Другие вопросы по теме