我有一个我写的方法来做以下事情。
按订单ID获取订单,按订单获取详细信息,不包括已取消的详细信息。
对于未被取消的每一行,请获取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 :(得分:0)
在另一台服务器上创建存储过程。然后使用SSIS将数据迁移到主服务器。