如果在应用程序启动时创建和播种大约 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 answerMcKayIs 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);