2015-08-31 69 views
0

需要在表格中添加500 000行。但是我的代碼版本花費了太多時間。 表問題5字段:id,NameQuestion,DetailsQuestion,UserId(Guid),Category(另一個表,多對多) 添加到表中的代碼示例問題500 000行。添加表格500 000行

public void AddFive() 
     { 
      var q = new Question(); 
      int counQ = 0; 
      for (int i=1; i<=100000; i++) 
      { 

       foreach (var x in GetUsers()) // 5 пользователей 
       { 
        ++counQ; 
      q = new Question 
      { 
       NameQuestion = "TestQuestion" + counQ, 
       DetailsQuestion = "TestQuestion" + counQ, 
       UserId =x, 
       Category = GetcategoryList() 
      }; 
      _context.Question.Add(q); 

       } 
       _context.SaveChanges(); 
      } 


     } 

     public List<Guid> GetUsers() 
     { 
      List<Guid> userList = (from x in _context.aspnet_Users 
       select x.UserId).ToList(); 
      return userList; 
     } 

     public List<Category> GetcategoryList() 
     { 

       var category = new List<Category>(); 
      Random rand = new Random(); 
      var count = rand.Next(1, 7); 

      for (int i = 1; i <= count; i++) 
      { 
       var idCategory = rand.Next(1, 7); 

        category.Add(_context.Category.Find(idCategory)); 

      } 

      return category.ToList(); 

     } 

如何加快流程?

+5

我投票關閉這一問題作爲題外話,因爲任何非俄羅斯揚聲器幫不了你。 –

+0

你能把文字改成英文嗎?我希望我認識俄羅斯人。 – AgapwIesu

+0

有了上述問題,你還應該把俄語教程! –

回答

0

您應該關閉並重新創建一個新的上下文每100次迭代爲每個新用戶清除背景和避免加收它

考慮從你的情況下,爲了防止自動關閉Configuration.AutoDetectChangesEnabled財產該DetectChanges()方法的調用

Source

0

要插入cnan做最好的BCP(批量複製)記錄這樣一個龐大的數字:

  questionDT = new DataTable(); 
     questionDT.Columns.Add(new DataColumn("NameQuestion", typeof(string))); 
     questionDT.Columns.Add(new DataColumn("DetailsQuestion", typeof(string))); 
     questionDT.Columns.Add(new DataColumn("UserId", typeof(int))); 
     var q = new Question(); 
     int counQ = 0; 
     for (int i=1; i<=100000; i++) 
     { 

      foreach (var x in GetUsers()) 
      { 
       ++counQ; 
       var dr = questionDT.NewRow(); 

       dr["NameQuestion"] = "TestQuestion" + counQ; 
       dr["DetailsQuestion"] = "TestQuestion" + counQ; 
       dr["UserId"] = x; 
       questionDT.Rows.Add(dr); 
      } 
     } 
     using (var c = new SqlConnection(connectionstring)) 
     { 
      c.Open(); 
      using (var bcp = new SqlBulkCopy(c)) 
      { 
       bcp.BatchSize = 10000; 
       bcp.ColumnMappings.Add("NameQuestion", "NameQuestion"); 
       bcp.ColumnMappings.Add("DetailsQuestion", "DetailsQuestion"); 
       bcp.ColumnMappings.Add("UserId", "UserId"); 
       bcp.DestinationTableName = "Questions"; 
       bcp.BulkCopyTimeout = 0; 
       bcp.WriteToServer(questionDT); 
      } 
      c.Close(); 
     } 

BCP爲巨大的刀片做出,它消除了索引和外鍵以前生產更新,並重新將它們相加後更新