2016-05-13 37 views
-1

Ich habe eine Funktion, die EF verwenden, aber es funktioniert zu langsam ... Kennen Sie irgendwelche Möglichkeiten, wie Sie die Leistung dieser Funktion verbessern?Leistung von Entity Framework

public static void SaveCombiners() 
    { 
     using (var db = new IP_dbEntities()) 
     { 
      db.COMBINERs.RemoveRange(db.COMBINERs); 
      foreach (var type1 in EventTypesList) 
      { 
       foreach (var type2 in EventTypesList) 
       { 
        db.COMBINERs.Add(new COMBINER() 
        { 
         EVENTS_TYPE = db.EVENTS_TYPE.Single(type => type.event_type == type1), 
         EVENTS_TYPE1 = db.EVENTS_TYPE.Single(type => type.event_type == type2), 
         combine_status = _eventTypesCombinerCollection[type1][type2].Value == true ? "+" : "-" 
        }); 
       } 
      } 
      db.SaveChanges(); 
     } 
    } 
+0

schreibt es in reiner SQL und verwenden 'db.Database.ExecuteSqlQuery (SQL, params) .ToListAsync();' –

+0

Warum Sie schreiben 2 "Foreach" für 1 Liste? –

+0

Yeah, +1, also, was Sie besser finden können, ist, eine Reihe von Reads zu tun, dann tun Sie Ihre schreibt ... anstatt zu lesen, jedes Mal, wenn Sie einen schreiben !!! –

Antwort

3

Sie immer AddRange über hinzufügen verwenden sollten. Die Add-Methode versucht, DetectChanges jedes Mal zu ermitteln, wenn die add-Methode während AddRange nur einmal aufgerufen wird.

public static void SaveCombiners() 
{ 
    using (var db = new IP_dbEntities()) 
    { 
     db.COMBINERs.RemoveRange(db.COMBINERs); 

     List<COMBINER> list = new List<COMBINER>(); 

     foreach (var type1 in EventTypesList) 
     { 
      foreach (var type2 in EventTypesList) 
      { 
       list.Add(new COMBINER() 
       { 
        EVENTS_TYPE = db.EVENTS_TYPE.Single(type => type.event_type == type1), 
        EVENTS_TYPE1 = db.EVENTS_TYPE.Single(type => type.event_type == type2), 
        combine_status = _eventTypesCombinerCollection[type1][type2].Value == true ? "+" : "-" 
       }); 
      } 
     } 

     db.COMBINERs.AddRange(list); 
     db.SaveChanges(); 
    } 
} 

Das gesagt, Sie stehen vor einem anderen Leistungsproblem.

Für alle Datensätze, die gelöscht oder hinzugefügt werden sollen, ist ein Datenbank-Umlauf erforderlich. Wenn Sie also 10.000 Datensätze löschen und 5.000 Datensätze hinzufügen, werden 15.000 Datenbank-Roundtrips benötigt, was SEHR langsam ist.

Haftungsausschluss: Ich bin der Besitzer des Projekts Entity Framework Extensions

Diese Bibliothek ermöglichen Massenvorgänge innerhalb Entity Framework auszuführen. Sie müssen einfach "SaveChanges" um "BulkSaveChanges" ändern, um die Leistung drastisch zu verbessern.

public static void SaveCombiners() 
{ 
    using (var db = new IP_dbEntities()) 
    { 
     db.COMBINERs.RemoveRange(db.COMBINERs); 
     // ... code.. 
     db.COMBINERs.AddRange(list); 

     db.BulkSaveChanges(); 
    } 
} 
0

RemoveRange und AddRange zu langsam sind, versuchen ExecuteSqlCommand

MyContext.Database.ExecuteSqlCommand("Delete from MyTable"); 
+0

Es wäre besser, den Befehl "TRUNCATE TABLE [TableName]" hier zu verwenden, wenn alle Zeilen gelöscht werden müssen – AndrewSilver

+0

@AndrewSilver - vielleicht, aber vielleicht nicht. Truncate löst keine Trigger aus, sollte also für DDL und nicht für DML reserviert sein. – PhillipH

+0

Es ist OK, dass ich foreach zweimal benutze, weil es den gleichen Zeilen- und Spaltennamen in meinem 2 dimensionalen Wörterbuch gibt –