将多个嵌套的createforeach循环展平为批量创建/插入的任何方法

本文关键字:创建 任何 插入 方法 嵌套 createforeach 循环 | 更新日期: 2023-09-27 18:25:04

我遇到了一种情况,我试图提高嵌套foreach循环中的一组创建的性能。它用于创建工单。在生成工作订单之前,可以添加任意数量的属性、供应商和工作订单项目/成本。将为添加的每个属性/供应商生成工作订单,因此所有选定的供应商都将为每个属性创建工作订单。如果添加太多,可能会变得一团糟。不幸的是,这些都是客户希望系统运行的方式,所以我不能重新设计它(或者它已经被重新设计了)。

代码被简化为只包括相关部分-

DbContext dbContext = new DbContext();
foreach (Property property in properties)
{
    foreach (Vendor vendor in vendors)
    {
        WorkOrder wo = new WorkOrder();
        WorkOrder.PropertyID = property.PropertyID;
        WorkOrder.VendorID = vendor.VendorID;
        dbContext.AddObject(wo);
        dbContext.SaveChanges();
        foreach (WorkOrderItemViewModel itemView in workOrderItemViewModels)
        {
            WorkOrderItem item = new WorkOrderItem();
            item.WorkOrderID = wo.WorkOrderID;
            dbContext.AddObject(item);
            dbContext.SaveChanges();
            foreach (WorkOrderItemCostViewModel costView in workOrderItemCostViewModels)
            {
                WorkOrderItemCost cost = new WorkOrderItemCost();
                cost.WorkOrderItemID = item.WorkOrderItemID;
                dbContext.AddObject(cost);
                dbContext.SaveChanges();
            }
        }
    }
}

这是很多嵌套的创建。如果他们在工单中添加太多内容,可能需要很长时间。一件只有2个物体,翻译过来就是:

2处房产x 2家供应商=4份工作订单

2个工作订单项目x 4个工作订单=8个工作订单项

2个项目成本x 8个工作订单项目=16个项目成本

总计=28创建

问题是,我需要当前对象的前一个对象的ID。因此,在我创建下一个对象之前,需要先创建它们。我看过一些解决方案,比如SQLite或大容量插入。。。。但看起来它们都需要采用标准的sql字符串格式。我试着研究一下是否可以将linq-to-entities生成的sql查询输出为字符串,但我没有发现任何有用的东西。

有没有什么好的方法可以在客户端的规范中重写这一点,以获得急需的性能提升?

将多个嵌套的createforeach循环展平为批量创建/插入的任何方法

只使用dbContext.SaveChanges();一次将优化性能。

使用这个替代:

DbContext dbContext = new DbContext();
foreach (Property property in properties)
{
    foreach (Vendor vendor in vendors)
    {
         WorkOrder wo = new WorkOrder();
         WorkOrder.PropertyID = property.PropertyID;
         WorkOrder.VendorID = vendor.VendorID;
         dbContext.AddObject(wo);
         foreach (WorkOrderItemViewModel itemView in workOrderItemViewModels)
         {
             WorkOrderItem item = new WorkOrderItem();
             item.WorkOrderID = wo.WorkOrderID;
             dbContext.AddObject(item);
             foreach (WorkOrderItemCostViewModel costView in workOrderItemCostViewModels) 
             {
                 WorkOrderItemCost cost = new WorkOrderItemCost();
                 cost.WorkOrderItemID = item.WorkOrderItemID;
                 dbContext.AddObject(cost);
             }
         }
     }
}
dbContext.SaveChanges();

我想明白了。我不认为这会起作用,因为我不认为主键会在创建/保存更改后填充到模型中(但它们确实存在)-就在这里(而且很简单):

DbContext dbContext = new DbContext();
List<WorkOrder> workOrders = new List<WorkOrder>();
List<WorkOrderItem> workOrderItems = new List<WorkOrderItem>();
foreach (Property property in properties)
{
    foreach (Vendor vendor in vendors)
    {
        WorkOrder wo = new WorkOrder();
        WorkOrder.PropertyID = property.PropertyID;
        WorkOrder.VendorID = vendor.VendorID;
        dbContext.AddObject(wo);
        workOrders.Add(wo);
    }
}
dbContext.SaveChanges();
foreach (WorkOrder wo in workOrders)
{
    foreach (WorkOrderItemViewModel itemView in workOrderItemViewModels)
    {
        WorkOrderItem item = new WorkOrderItem();
        item.WorkOrderID = wo.WorkOrderID;
        dbContext.AddObject(item);
        workOrderItems.Add(item);
    }
}
dbContext.SaveChanges();
foreach (WorkOrderItem item in workOrderItems)
{
    foreach (WorkOrderItemCostViewModel costView in workOrderItemCostViewModels)
    {
        WorkOrderItemCost cost = new WorkOrderItemCost();
        cost.WorkOrderItemID = item.WorkOrderItemID;
        dbContext.AddObject(cost);
    }
}
dbContext.SaveChanges();
相关文章: