我有一个使用EF的功能,但效果太慢了...... 你知道如何提高这个功能的性能吗?
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 :(得分:4)
您应该始终使用 AddRange 而不是添加。每次在AddRange上调用add方法时,Add方法将尝试DetectChanges。
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();
}
}
话虽如此,您还面临另一个性能问题。
要删除或添加的每个记录都需要数据库往返。因此,如果删除10,000条记录并添加5,000条记录,则需要15,000次数据库往返,这非常慢。
免责声明:我是该项目的所有者Entity Framework Extensions
此库允许您在实体框架内执行批量操作。您只需通过“ BulkSaveChanges ”更改“SaveChanges”即可显着提高性能。
public static void SaveCombiners()
{
using (var db = new IP_dbEntities())
{
db.COMBINERs.RemoveRange(db.COMBINERs);
// ... code..
db.COMBINERs.AddRange(list);
db.BulkSaveChanges();
}
}
答案 1 :(得分:0)
RemoveRange 和 AddRange 太慢,请尝试 ExecuteSqlCommand
MyContext.Database.ExecuteSqlCommand("Delete from MyTable");