将多个嵌套的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查询输出为字符串,但我没有发现任何有用的东西。
有没有什么好的方法可以在客户端的规范中重写这一点,以获得急需的性能提升?
只使用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();