更快的方法 - 实体框架数据转换

时间:2016-07-19 17:31:00

标签: c# sql entity-framework tsql

我有一个我写的方法来做以下事情。

按订单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年的记录。有更快的方法吗?是否可以为整个过程编写直接查询?我是否可以采取一些实体代码修改来加快这一过程?

1 个答案:

答案 0 :(得分:0)

在另一台服务器上创建存储过程。然后使用SSIS将数据迁移到主服务器。