我有一个控制台线应用程序,通过LINQ将大约150,000行保存到数据库。这工作正常(我通常会期望它停止工作)。这是一个沼泽标准保存从CSV文件中读取数据后进行更改来电: -LINQ SaveChanges()异常缓慢
List<Invoice> oldInvoices = db.Invoices.Where(x => !x.IsVisible).ToList();
List<int> oldInvoiceIDs = oldInvoices.Select(s => s.InvoiceID).ToList();
List<InvoiceProduct> allInvoiceProducts = db.InvoiceProducts.ToList();
List<InvoiceProduct> oldInvoiceProducts = allInvoiceProducts.Where(x => oldInvoiceIDs.Contains(x.InvoiceID)).ToList();
db.InvoiceProducts.RemoveRange(oldInvoiceProducts);
db.Invoices.RemoveRange(oldInvoices);
UpdateConsole.WriteLine("Switching over invoices completed. Please wait...", ConsoleColor.Black, ConsoleColor.Magenta);
表是用的产品对每张发票子链接表的发票清单。每次我们获取新数据时,我们都会写入新数据,在数据库中将其标记为不可见,然后将当前可见数据切换为不可见,并将当前不可见数据切换为可见数据,从而可以立即切换从一个数据集到下一个数据集。刚刚被标记为不可见的数据集然后通过LINQ被删除。
这需要时间来删除,但不是不合理的时间量。由于此数据来自CSV数据文件,因此我们记录了行数以及文件读取的开始和结束日期和时间。这是存储在另一个数据库表和代码保存为: -
importLog.SuccessfullyImportedRows = successfulRows;
importLog.FailedImportedRows = failedRows;
importLog.EndTime = DateTime.Now;
db.SaveChanges();
这保存,超过40分钟需要和我不知道为什么。我能想到的唯一的事情就是它使用了在Visual Studio中生成EDMX时可用的相同的DBEntities类。
有没有人有这个?它给应用程序挂的外观,但它确实持续40分钟打完...
可能重复[如何更快地运行此任务](http://stackoverflow.com/questions/37374480/how-can-i-run-this-task-faster) – Veverke
可能会帮助您http:// stackoverflow.com/questions/37096509/why-getting-data-with-entity-framwork-is-slow – mohsen
感谢您的链接。后者是关于循环内部的SaveChanges(),而我并不是。还值得注意的是,当我保存177,000条记录时,我保存到本地列表中,然后执行AddRange()和SaveChanges()。我只调用SaveChanges()一次保存列表,第二次保存日志。没有任何循环的SaveChanges(),相同的问题仍然存在吗? –