Как минимизировать C #, код LINQ при удалении нескольких записей - PullRequest
0 голосов
/ 06 мая 2019

Вот метод удаления нулевых записей инвентаризации из таблицы инвентаризации. Я хотел бы сократить код / ​​количество раз, которое LINQ выполняется в базе данных.

Инвентарный стол

public class Inventory
    {
        public int itemCode { get; set; }
        public decimal price { get; set; }
        public decimal availQty { get; set; } // Can have Negative values.
    }

пример данных

itemCode    price       availQty
1           10           10
1           12          -10
2           10           10

Из приведенных выше записей я хочу удалить все записи itemCode == 1, поскольку net availableQty равно 0.

Вот мой метод

private void RemoveZeroInvs()
        {
        // Remove individual zero Inventorys
            var rinvs = from ri in _context.Inventorys
                        where ri.availQty == 0
                        select ri;

            _context.Inventorys.RemoveRange(rinvs);
            _context.SaveChanges();

            // Remove if group is zero in availQty, as it allows Negative Qty.
            var result = from d in _context.Inventorys
                         group d by new
                         {
                             d.itemCode
                         }
                          into g
                         select new
                         {
                             g.Key.itemCode,
                             availQty = g.Sum(y => y.availQty)
                         };

            var zrs = from r in result
                      where r.availQty == 0
                      select r;

            foreach (var zr in zrs) // Here, zrs length may be more than 500
            {
                var ri = _context.Inventorys.Where(w => w.itemCode == zr.itemCode);
                _context.Inventorys.RemoveRange(ri);
                _context.SaveChanges();
            }
        }

Я использую Asp.Net Core 2.2. Есть ли такая возможность?

Также я получаю следующую ошибку в строке _context.Inventorys.RemoveRange(ri); в цикле.

A command is already in progress: SELECT t."itemCode", t."availQty"
FROM (
    SELECT d."itemCode", SUM(d."availQty") AS "availQty"
    FROM "Inventorys" AS d
    GROUP BY d."itemCode"
) AS t

1 Ответ

0 голосов
/ 06 мая 2019
var todelete = _context.Inventorys
   .GroupBy(i => i.itemCode)
   .Where(g => g.Sum(i => i.availQty) == 0)
   .SelectMany(g => g);

Вот более короткие версии вашего кода, с точки зрения исключения БД, придется сравнить необработанные запросы. Но может быть легче, если ваш код ...

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