【发布时间】:2016-05-31 09:15:32
【问题描述】:
我有一个控制台行应用程序,它通过 LINQ 将大约 150,000 行保存到数据库中。这很好用(我通常希望它停止工作)。这是从 CSV 文件中读取数据后的标准保存更改调用:-
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 分钟左右后继续......
【问题讨论】:
-
感谢那里的链接。后者是关于循环内的 SaveChanges() ,而我的不是。还值得注意的是,当我保存 177,000 条记录时,我保存到本地列表,然后执行 AddRange(),然后执行 SaveChanges()。我只调用 SaveChanges() 一次来保存列表,第二次调用保存日志。没有任何循环的 SaveChanges() 是否仍然存在相同的问题?
标签: c# linq visual-studio linq-to-entities edmx