Улучшение метода вставки - PullRequest
0 голосов
/ 22 июля 2010

Я написал метод вставки, который использует linq и перебирает 2 списка, первый из которых может обрабатывать до 14 тыс. Объектов и отправлять около 8 тыс. Объектов.

Всякий раз, когда я запускаю этот метод, я всегда получаю «Исключение тайм-аута транзакции». Можете ли вы помочь мне улучшить это?

public void InsertNewInventoryGoodsEvents(List<GoodsEvent> eventsList, List<InventoryGoods> goodsList)
{
    InventoryGoodsEvents ige = new InventoryGoodsEvents();
    TransactionScope scope= new TransactionScope();            
    int i = 0;
    const int batchSize = 50; // or even 50    
    foreach (InventoryGoods good in goodsList)
    {
        if (i == 50)
        {
            if (scope != null)
            {
                context.SubmitChanges();
            }
            i = 0;
        }    
        try
        {
             foreach (GoodsEvent g in eventsList)
             {
                 if (g.Gid == good.Gid)
                 {
                     ige = new InventoryGoodsEvents() { EventId = g.Id, InventoryGood = good.Id };    
                     context.InventoryGoodsEvents.InsertOnSubmit(ige);
                 }
             }
         }
         catch (Exception ex)
         {
             ex.ToString();    
         }    
         ++i;
     }
     if (scope != null)
     {    
         context.SubmitChanges();
         scope.Complete();                 
     }
}

Ответы [ 3 ]

0 голосов
/ 22 июля 2010

Foreach в foreach можно переписать так:

var itsReallyJustAJoin = (from g in GoodEvent
                          join i in InventoryEvent on g.Gid equals i.Gid
                          select new {g.Id, good.Id}).ToList();

Затем вы можете вставить их так, как захотите.Похоже, вы делаете партии по 50 прямо сейчас?Вы можете продолжить это, если хотите ... Это заберет всю работу за пределы области транзакции, так что вы, вероятно, сможете сразу же пролистать весь бит, если ваши результаты не слишком велики.

0 голосов
/ 22 июля 2010

Я переписал метод после того, как хорошо его обдумал, и получилось так:

public void InsertNewInventoryGoodsEvents(List<GoodsEvent> eventsList, List<InventoryGoods> goodsList)
        {

            List<InventoryGoodsEvents> mylist = new List<InventoryGoodsEvents>();
            InventoryGoodsEvents ige = new InventoryGoodsEvents();

            foreach (GoodsEvent g in eventsList)
            {
                foreach (InventoryGoods ig in goodsList)
                {
                    if (ig.Gid == g.Gid)
                    {
                        ige = new InventoryGoodsEvents();
                        ige.EventId = g.Id;
                        ige.InventoryGood = ig.Id;
                        mylist.Add(ige);
                    }
                }
            }

            using (var scope = new TransactionScope())
            {
                foreach (InventoryGoodsEvents ip in mylist)
                {
                    context.InventoryGoodsEvents.InsertOnSubmit(ip);
                }

                context.SubmitChanges();
                scope.Complete();
            }
        }

Мне понравилась идея MikeM об упрощении вещей, но мы увидим, какой метод я оставлю.

0 голосов
/ 22 июля 2010

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

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