我一直在尝试更新一个包含100万条记录的表,并将其4个字段的NULL值替换为空字符串(“”)。 Foreach和似乎需要很长时间。我花了1分钟更新了3 000条记录。有没有更简单的方法来使用linq或可能的过程来更新表?
这是我目前使用的,但它需要永远,我可能需要经常这样做:
foreach (MG_Backup item in mg)
{
lblAllNulls.Text +="<br />ID:"+item.ID+" ";
if (item.Name == null )
{
item.Name = "";
lblAllNulls.Text += "Name ";
}
if (item.Company == null)
{
item.Company = "";
lblAllNulls.Text += "Company ";
}
if (item.Addr1 == null)
{
item.Addr1 = "";
lblAllNulls.Text += "Addr1 ";
}
if (item.Addr2 == null)
{
item.Addr2 = "";
lblAllNulls.Text += "Addr2 ";
}
if (item.FullAddress == null)
{
item.FullAddress = "";
lblAllNulls.Text += "FullAddress ";
}
if (item.City == null)
{
item.City = "";
lblAllNulls.Text += "City ";
}
//saves the changes
db.SaveChanges();
}
答案 0 :(得分:1)
对于db代码,您将分别更新每条记录。尝试将SaveChanges()
移出循环。或者使用计数器保护它,并且只保存每N个记录。
lblAllNulls
的代码显示了需要StringBuilder的经典模式:
foreach (MG_Backup item in mg)
{
lblAllNulls.Text +="<br />ID:"+item.ID+" ";
...
}
字符串在foreach循环中连接。 lblAllNulls.Text
必须不断重新分配复制。几千回合后,这变得非常缓慢。
答案 1 :(得分:1)
您没有显示您的LINQ语句,但是从您的代码中我假设您执行了类似的操作:
var mg = from mgs in <Table>
select mgs;
//loop you showed
这会导致LINQ获取所有项目,无论它们是否必须更新。
根据您实际需要更新的记录数量,您可以通过以下方式获得更快的速度:
var mg = from mgs in <Table>
where mgs.Name == null || mgs.Company == null // || and so on and so forth
select mgs;
//loop you showed