0

我一直在尝试更新具有 100 万条记录的表,并将其 4 个字段的 NULL 值替换为空字符串( "" )。foreach 和 for 似乎需要很长时间。我花了 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();
}
4

2 回答 2

1

至于 db 代码,您正在单独更新每条记录。尝试移出SaveChanges()循环。或者用一个计数器保护它,只保存每 N 条记录。

您的代码lblAllNulls显示了需要 StringBuilder 的经典模式:

foreach (MG_Backup item in mg)
{
   lblAllNulls.Text +="<br />ID:"+item.ID+" ";
   ...
}

字符串在 foreach 循环中连接。lblAllNulls.Text必须不断地重新分配一个副本。几千轮之后,这变得非常缓慢。

于 2013-04-04T12:41:33.503 回答
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
于 2013-04-04T12:48:32.280 回答