Массовое копирование обновления C # ASP.NET MVC - PullRequest
0 голосов
/ 19 октября 2018

У меня есть 2 таблицы с относительно большим количеством информации.В рамках этого процесса мне нужно обновить Таблицу 2 (Inv) информацией из Таблицы 1. По существу скопируйте значение CC из Таблицы 1 (Acc) в значение PCC в Таблице 2.

Количество обновлений варьируетсяот 4000 до 40000 строк и страница зависает довольно долго.Я не могу запустить это в фоновом режиме, потому что другой процесс должен запускаться непосредственно после него, который требует, чтобы это обновление сначала происходило и выводилось пользователю.

Как я могу ускорить процесс?

Текущий код:

            var invList = db.Inv.Where(m => m.ID == GI.Id).ToList();
            var invListAcc = invList .Select(m => m.AccNum).ToList();
            var accExtract = db.Acc.Where(m => invListAcc .Contains(m.AccNum)).ToList();
            foreach(var inv in invList)
            {
                var invDB = db.Inv.Find(inv.Id);
                var accCC = accExtract.Where(m => m.AccNum== invDB.AccNum).Select(p=>p.CC).FirstOrDefault();
                if(accCC != null)
                {
                    invDB.PCC = accCC;
                    db.Entry(invDB).State = EntityState.Modified;
                    db.SaveChanges();

                } 
            }

Таблица: Acc

+------------+---------+
|    AccNum  |   CC    |
+------------+---------+
|    123     |   34    |
|    124     |   24    |
+------------+---------+

Таблица: Inv

+-------+------------+---------+
|  Id   |    AccNum  |   PCC   |
+-------+------------+---------+
|   1   |    123     |         |
|   2   |    124     |         |
+-------+------------+---------+

Ответы [ 2 ]

0 голосов
/ 19 октября 2018

переместить db.SaveChanges ();внешний вид foreach ... да, все будет сделано .. вы неправильно используете фреймворк

 var invList = db.Inv.Where(m => m.ID == GI.Id).ToList();
 var invListAcc = invList .Select(m => m.AccNum).ToList();
 var accExtract = db.Acc.Where(m => invListAcc .Contains(m.AccNum)).ToList();
 foreach(var inv in invList)
 {
      var invDB = db.Inv.Find(inv.Id);
      var accCC = accExtract.Where(m => m.AccNum== invDB.AccNum).Select(p=>p.CC).FirstOrDefault();
      if(accCC != null)
      {
           invDB.PCC = accCC;
           db.Entry(invDB).State = EntityState.Modified;

      } 
 }
 db.SaveChanges();

и посмотрите, сможете ли вы просто получить то, с чем работаете, вместо вызова var invDB = db.Inv.Find(inv.Id);в каждом цикле ... это вызов БД в БД для каждого цикла, который стоит дорого

, используйте другой ответ здесь, чтобы получить все записи для цикла ... затем обновите затем SaveChanges.

ОБНОВЛЕНИЕ

  • обновить PCC всех счетов-фактур с помощью CC учетной записи, где счет связан с учетной записью.

  • ваше решениезависит от того, как вы смоделировали свои сущности

  • я бы не рекомендовал, чтобы вы продолжали работать в системе, поскольку это должно быть когда-то требование
    • , но если вы смоделировали их правильноВы можете сделать что-то вроде:

, используя include

var invList = db.Inv.include(x=>x.Acc).tolist(); -- required EF extension for include, this is 1 db call
foreach(var item in invList)
{
    var account = item.Accl
    if (account != null )
    {
        item.PCC = account.CC  
    }   
}
db.SaveChanges();
0 голосов
/ 19 октября 2018

Вы можете сделать это быстро, используя чистый SQL

update A
set A.ACC =  B.CC
from Inv A inner join Acc B
on B.AccNum = A.AccNum
...