处理两个泛型集合差异化
项目中经常会有这样一个需求,对列表进行操作,抛除封装好的控件外,大部分时间我们需要我们自己写业务逻辑
简单记录以下我的做法以及发现错误的历程(事后想想是没有难度,只不过有些点自己当时没有考虑到)。
Tep1 在做到这个功能模块的时候首先的想法是把现有的数据全部删除,在点击保存的时候保存页面上面所有的数据。这种办法行不行~~肯定行,不过这样的效率确实不高,尤其是数据量比较大的时候,当做一点小小的修改的时候消耗的资源也比较大,所以在简单思考后否定了这种方案。
Tep2 这里面会涉及到两个List集合 也就是List<Page> 要最终保存的集合 和List<DB> 已经在数据库中存在的集合 。怎么实现最容易想到的方法就是做两次循环,循环List<Page> 在循环内部通过主键去查询是否存在与List<DB>中,如果不存在执行Create操作,否则执行Update操作,这样也是会频繁的消耗数据库的资源,效率低下。同否
Tep3 在内存中处理速度远比操作数据库快,所以可以把List<DB>查询出来比较 两个List的异同,贴出来代码,里面还是有几个容易坑的地方
1 using (ITransaction trans = Nesoft.Utility.TransactionManager.Create()) 2 { 3 //取出当前POMaster对应的List 在内存中判断是否存在 找到已经删除的 4 List<PurchaseOrderItemInfo> poItemsInDB = ProductPurchaseDA.GetPoItems(poInfo.SysNo.GetValueOrDefault()); 5 //处理要删除的商品 集合 6 List<PurchaseOrderItemInfo> poItemsInDBDel = poItemsInDB; 7 foreach (PurchaseOrderItemInfo item in poInfo.POItems) 8 { 9 if (poItemsInDB.Exists(o => o.ProductSysNo == item.ProductSysNo)) 10 { 11 //已存在修改 12 item.Quantity = 0; 13 //将采购数量初始化为PrePurchaseQty 14 item.PurchaseQty = item.PrePurchaseQty; 15 item.POSysNo = poInfo.SysNo; 16 item.ItemSysNo = item.ItemSysNo; 17 item.ReturnCost = 0; 18 //创建PO Item: 19 ProductPurchaseDA.UpdatePOItem(item); 20 21 //同时把poItemsInDBDel 移除对应的元素 22 poItemsInDBDel.Remove(poItemsInDBDel.FirstOrDefault(b => b.ProductSysNo == item.ProductSysNo)); 23 } 24 else 25 { 26 item.Quantity = 0; 27 //将采购数量初始化为PrePurchaseQty 28 item.PurchaseQty = item.PrePurchaseQty; 29 item.POSysNo = poInfo.SysNo; 30 item.ItemSysNo = item.ItemSysNo; 31 //创建PO Item: 32 ProductPurchaseDA.CreatePOItem(item); 33 } 34 } 35 //删除poItemsInDBDel中剩余的所有元素 36 foreach (var itemDel in poItemsInDBDel) 37 { 38 ProductPurchaseDA.DeletePOItem(itemDel.POSysNo.GetValueOrDefault(), itemDel.ProductSysNo.GetValueOrDefault()); 39 } 40 trans.Complete(); 41 }
上面的代码部分我最开始的时候是遗漏了 要删除的部分,比较List<Page> 的元素是否存在于List<DB>中只能够操作新增和修改的数据,而删除的数据在这里面不能够被正确删除,除非再做一次反向的比较,即循环List<DB> 比较是否存在于List<Page>,只不过这样会看起来很啰嗦, 这时就思考既然能够查询出来操作的List<DB>的数据,那么剩下的数据是不是就是要删除的数据,那在执行Update操作后去除List<DB>的元素不就OK了 .注意坑就在这里出现,按照上面的思路总是不能够正确删除,仔细查找后发现,我在循环里面把当前元素的删除,造成循环的下标发生改变。所以正确的做法应该再重新定义一个集合给专门用来存储要删除数据库中元素。代码如上
功能很常见,也很简单,就是有几个容易遗漏的点。记录下工作中的点点滴滴 每天进步一点点。