2016-07-19 2 views
0

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

Получить заказы по неделям, используя Id Order, получить детали по таблице OrderDetail, исключая строку детали, которая отменена.

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

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

Положите это число на неделю в другой стол.

private void ProcessOrders(string[] orders, DateTime weekOf) 
    { 
     Dictionary<string, int> tmpRes = new Dictionary<string, int>(); 
     using (var context = new AS400_PIM5ContextDataContext()) 
     { 
      context.CommandTimeout = 0; 
      foreach (var ord in orders) 
      { 
       var orderDetails = context.OrderDetails.Where(x => x.OrderNumber.Equals(ord) && (!x.Status.HasValue || x.Status.Value != 'C')); 
       foreach (var detail in orderDetails) 
       { 
        var sku = detail.ProductNumber.Trim().ToUpper(); 
        var squ = detail.SequenceNumber; 
        var realSkus = context.OrderDetailRaws.Where(x => x.SequenceNumber == squ && x.OrderNumber == detail.OrderNumber); 
        foreach (var val in realSkus) 
        { 
         if (!string.IsNullOrEmpty(val.RawMaterialSku) && !string.IsNullOrWhiteSpace(val.RawMaterialSku)) 
         { 
          sku = val.RawMaterialSku.Trim().ToUpper(); 
          break; 
         } 
        } 
        var children = GetChildern(sku, context); 
        foreach (var child in children.Keys) 
        { 
         if (child.Equals(sku)) 
          if (context.SupplyChain_ComponentPAs.Any(x => x.ProductNumber.Equals(sku))) 
           continue; 
         decimal umo = 0m; 
         children.TryGetValue(child, out umo); 
         if (umo == 0) 
          throw new Exception(); 
         if (tmpRes.ContainsKey(child)) 
         { 
          int currentUsage = 0; 
          tmpRes.TryGetValue(child, out currentUsage); 
          tmpRes.Remove(child); 
          tmpRes.Add(child, Convert.ToInt32(currentUsage + (umo * detail.Quantity))); 
         } 
         else 
         { 
          tmpRes.Add(child, Convert.ToInt32(umo * detail.Quantity)); 
         } 
        } 
       } 
      } 
      foreach (var key in tmpRes.Keys) 
      { 
       int outVal = 0; 
       tmpRes.TryGetValue(key, out outVal); 
       var tmpPre = new SupplyChain_PostMinMax(); 
       tmpPre.ProductNumber = key; 
       tmpPre.Usage = outVal; 
       tmpPre.IsWeekly = true; 
       tmpPre.ReferenceDate = weekOf; 
       context.SupplyChain_PostMinMaxes.InsertOnSubmit(tmpPre); 
      } 
      context.SubmitChanges(); 
     } 
    } 

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

ответ

0

Создал хранимую процедуру на другом сервере. Затем используется SSIS для переноса данных на главный сервер.