如何解决如果在应用程序启动时创建和播种大约 120k 条记录,有没有办法加快应用程序的响应时间?
在 BooksList 中,我有大约 60k 条记录,而在 Readers 中我只有大约 20 条记录。
现在,要填充桥接表(多对多),我必须为每个 BookList 记录分配至少 2 个读者。
已完成,但在第一次加载应用时,大约需要约 30 秒。
正常吗?
有什么办法可以加快速度吗?
注意:这是要求,我必须这样做,这意味着我必须在第一次加载时播种数据,但我关心的是性能。
foreach (var n in BooksList) //60k records
{
int innerLoopCounter = 0;
foreach (var t in ReadersList) //only 20 registered readers
{
BooksReadersList.Add(new BooksReaders() { BooksID = n.BooksID,ReaderID = t.ReaderID });
innerLoopCounter++;
if (innerLoopCounter > 2) //should not be more than 2.
break;
}
}
BooksDbContext.BooksReaders.AddRange(BooksReadersList);
BooksDbContext.ChangeTracker.DetectChanges();
base.Seed(BooksDbContext);
BooksReadersList 是一个 BookReaders 类型的列表,它有 3 列(ID、Book_ID、Reader_ID)。
BooksList 是 Books 类型列表,有 2 列(ID,BookTitle),ReaderList 是 Readers 类型列表,有 2 列(ID,ReaderName)。
解决方法
我是根据问题中显示的代码在这里猜测的。我根据 this answer 到 McKay 的 Is there a good LINQ way to do a cartesian product? 创建了 BooksList 和来自 ReadersList 的前两个读者的 LINQ 样式笛卡尔积。我不知道这是否会更快,但它会将循环移出用户代码。希望 EF 将其转换为一些高效的 SQL。效率不如 SqlBulkCopy 或写出的普通旧 SQL 语句,但考虑到约束...
var BooksReadersList = BooksList.SelectMany((b) => ReadersList.Take(2),(book,readers) => readers.Select(reader => new BooksReader
{ book.BooksID,reader.ReaderID }));
BooksDbContext.BooksReaders.AddRange(BooksReadersList);
BooksDbContext.ChangeTracker.DetectChanges();
base.Seed(BooksDbContext);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。