C# 如果应用程序在启动时创建并植入大约120k的记录,有没有办法加快应用程序的响应时间?
在图书列表中,我有大约6万张唱片,而在阅读器中,我只有大约20张 现在,为了填充桥接表(多对多),我必须为每个BookList记录分配至少两个读卡器 已经完成,但在首次加载应用程序时,大约需要30秒 这正常吗 有没有办法加快速度 注意:这是要求,我必须这样做,这意味着我必须在第一次加载时播种数据,但我关心的是性能C# 如果应用程序在启动时创建并植入大约120k的记录,有没有办法加快应用程序的响应时间?,c#,entity-framework,loops,foreach,entity-framework-6,C#,Entity Framework,Loops,Foreach,Entity Framework 6,在图书列表中,我有大约6万张唱片,而在阅读器中,我只有大约20张 现在,为了填充桥接表(多对多),我必须为每个BookList记录分配至少两个读卡器 已经完成,但在首次加载应用程序时,大约需要30秒 这正常吗 有没有办法加快速度 注意:这是要求,我必须这样做,这意味着我必须在第一次加载时播种数据,但我关心的是性能 foreach (var n in BooksList) //60k records { int innerLoopCounter = 0; foreach (v
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);
BookReadersList是类型BookReaders的列表,它有3列(ID、Book\u ID、Reader\u ID)
BookList是一个类型图书列表,它有两列(ID,BookTitle),ReaderList是一个类型阅读器列表,它有两列(ID,ReaderName)。我是根据问题中显示的代码猜的。我创建了BooksList和ReadersList的前两个reader的LINQ风格的笛卡尔产品,基于by to。我不知道这是否会更快,但它会减少用户代码的循环。希望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);
这还不足以对您的问题进行准确评估。我们不知道
BooksList
的类型,n
的类型,或者BooksReadersList
的类型。从您发布的代码来看,EF的行为是不可预测的。我怀疑您可以通过几个精心选择的SQL语句使整个过程几乎瞬间完成。六万条记录不算多,即使乘以20。请对您的问题进行更好的描述,我们可能会给您提供更好的解决方法。@RobertHarvey抱歉,让我重新措辞并解释一下。更新,Harvey先生。@Hereticsmonkey它以某种方式将时间缩短了约10秒。好极了