LINQ更新表用EmptyString 100万条记录替换NULL

时间:2013-04-04 12:35:52

标签: c# linq time records

我一直在尝试更新一个包含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();
}

2 个答案:

答案 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