2013-04-04 48 views
0

我一直在试图更新一个拥有100万条记录并将其字段的NULL值替换为空字符串(“”)的表。 Foreach和似乎需要很长时间。我花了1分钟更新3 000条记录。有更简单的方法来更新表使用LINQ或可能的程序?LINQ更新表用EmptyString替换NULL 100万条记录

这是我此刻的使用,但它永远需要,我可能需要经常这样做:

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

这听起来像一个存储过程的工作。 – asawyer 2013-04-04 12:37:47

+2

你不能通过SQL更新语句来完成吗? – Richard 2013-04-04 12:37:58

+1

但我有5个字段,我需要检查它们是否为空,并且它们中的任何一个都不得在同一时间为null。一个字段可能为空,下一个记录可能有另一个字段为空,所以基本上我将不得不运行5个更新语句超过100万条记录..这将需要很多时间..我认为... – Nathan 2013-04-04 12:41:00

回答

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 
+1

这正是我刚才所做的,我回来发布我的解决方案,但在这里你有相同的解决方案。做你也建议把我的记录从100万降低到10K ..不错:)最佳答案... – Nathan 2013-04-04 13:04:24

1

至于数据库的代码,你单独更新每个记录。尝试将SaveChanges()移出循环。或者用计数器来保护它,并且只保存它每N个记录。

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

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

字符串被foreach循环连接起来。 lblAllNulls.Text必须不断重新分配一个复制。几千轮之后,这会变得非常缓慢。

+1

我不是当你执行数百万次数据库往返时,肯定你会看到很多优化字符串分配的差异。 – asawyer 2013-04-04 12:44:47

+0

@asawyer - 对于1M记录它会计数。但实际上它不会接近解释3分钟记录的1分钟。 – 2013-04-04 12:48:05

+0

当然,并且介意你我从来没有测试过这个,但是在我看来,在等待数据库调用返回时,GC会有很多停机时间运行。 – asawyer 2013-04-04 12:49:21