我将一个excel的表格导入成gridview后,想将其再次导入到数据库中。
可是我想数据库中如果有这个excel里的数据的话(不是全部)。那么我就对其进行更新而不是插入。这里就有一个问题。加入我导入的excel表中有几万条数据,而数据库中也有几万条数据,那么我Gridview(导入excel表后)里每行都得与数据库里的几万条数据对比看是否有相同,再决定是插入还是更新。那么几万乘以几万次,这样的话会不会使这个系统的处理速度很慢(或者说完成操作都得十几分钟),有什么方法能对其进行优化,或者技术能对其进行有选择的对比而不是每个都对比一次。
请对这方面有经验或者做过类似的程序员帮帮忙。。。
正常应该是 先把数据库对比的键值 一次性缓存下来,然后EXCEL的键值与之对比,构建insert或update,最后一次更新数据库
将其进行一次性缓存,那么该怎么做。我是新手,没接触过这方面的内容。能改个例子我模仿下吗。。。。。。。
@回望未来: 你试试
//要比较的键值在 select new {....} 中
var products = (from c in context.Products select new { c.ID,c.Name }).ToList();// 一次性加载
//这里换成你的EXCEL数据集合
var stuffs = new List<Stuff> { new Stuff { name = "CCC1" }, new Stuff { name = "BBB1" } }; foreach (var s in stuffs) { var o=products.Where(n => n.Name == s.name);//不会再查数据库 if (o.Count(n => n.Name == s.name)==0) { //insert context.Products.Add(new NS.Models.Product { ID=Guid.NewGuid(), Name=s.name}); } else { //update NS.Models.Product update=new NS.Models.Product(); update.ID = o.FirstOrDefault().ID;//必须设置 update.Name=s.name; update.Count = 3; var e=context.Entry(update); if (e.State == System.Data.EntityState.Detached) { e.State = System.Data.EntityState.Modified; } } } context.SaveChanges(); //最后一次性更新
一般的做法,先删除,在ADD,别去判断更新了~~
如果你真要判断,那么就先针对统一字段排序,这样能够减少比较次数~
你先把数据库里的对比的键值用一个hash存起来,这个过程是O(n)复杂度,再把你要add 或update的数据的进行对比,这边的复杂度是O(m),这样的一个操作过程的复杂度最低只能做到O(M+N),只要不做成O(M*N)的复杂度就可以了,时间慢的应该是装箱拆箱的过程,用多线程来做吧,因为整个执行的时间比较,为了怕出现问题断电,误断的问题导致重新对比操作,最好用消息队列来做。
where里的条件先选取较少出现的字段做对比,那下一个条件就会在上一个前提下寻找数据,只要上一个筛选出的数据少,那么速度就会快了,例如:汉族,维吾尔族,
一般的处理方式是先删除后重新插入。整个过程用事务控制,以保证安全。
傻孩子,不管3721导入后,在数据库sql完成去重复操作
最好的解决办法是,直接将新的EXCLE插入到库中的一个新表
然后触发一个操作,将新表和旧表关联进行UPDATE
关联不到的直接进行插入
就完成了.效率杠杠滴