C# LINQ更新表将NULL替换为EmptyString 100万条记录
我一直在尝试更新一个有100万条记录的表,并将其中4个字段的空值替换为空字符串(“”)。Foreach和for似乎需要很长时间。我花了1分钟更新了3000条记录。是否有更简单的方法使用linq或过程更新表 这是我目前使用的方法,但需要花费很长时间,我可能需要经常这样做:C# LINQ更新表将NULL替换为EmptyString 100万条记录,c#,linq,time,records,C#,Linq,Time,Records,我一直在尝试更新一个有100万条记录的表,并将其中4个字段的空值替换为空字符串(“”)。Foreach和for似乎需要很长时间。我花了1分钟更新了3000条记录。是否有更简单的方法使用linq或过程更新表 这是我目前使用的方法,但需要花费很长时间,我可能需要经常这样做: foreach (MG_Backup item in mg) { lblAllNulls.Text +="<br />ID:"+item.ID+" "; if (item.Name == null )
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();
}
foreach(MG\u备份项,单位为MG)
{
lblAllNulls.Text+=”
ID:“+item.ID+”;
如果(item.Name==null)
{
项目名称=”;
lblAllNulls.Text+=“Name”;
}
如果(item.Company==null)
{
项目.公司=”;
lblAllNulls.Text+=“公司”;
}
如果(item.Addr1==null)
{
item.Addr1=“”;
lblAllNulls.Text+=“Addr1”;
}
如果(item.Addr2==null)
{
item.Addr2=“”;
lblAllNulls.Text+=“Addr2”;
}
if(item.FullAddress==null)
{
item.FullAddress=“”;
lblAllNulls.Text+=“完整地址”;
}
如果(item.City==null)
{
项目.城市=”;
lblAllNulls.Text+=“城市”;
}
//保存更改
db.SaveChanges();
}
至于数据库代码,您将分别更新每个记录。尝试将SaveChanges()
移出循环。或者用计数器保护它,并且每N条记录只保存一次
lblAllNulls
的代码显示了需要StringBuilder的经典模式:
foreach (MG_Backup item in mg)
{
lblAllNulls.Text +="<br />ID:"+item.ID+" ";
...
}
foreach(MG\u备份项,单位为MG)
{
lblAllNulls.Text+=”
ID:“+item.ID+”;
...
}
字符串在foreach循环中串联
lblAllNulls.Text
必须连续重新分配一个副本。这会在几千回合后变得非常缓慢 您没有显示LINQ语句,但从您的代码中,我假设您做了如下操作:
var mg = from mgs in <Table>
select mgs;
//loop you showed
var mg = from mgs in <Table>
where mgs.Name == null || mgs.Company == null // || and so on and so forth
select mgs;
//loop you showed
var mg=来自中的mgs
选择mgs;
//你展示的循环
这将导致LINQ获取所有项,而不管它们是否必须更新。
根据您实际需要更新的记录数量,您可以通过以下方式加快更新速度:
var mg = from mgs in <Table>
select mgs;
//loop you showed
var mg = from mgs in <Table>
where mgs.Name == null || mgs.Company == null // || and so on and so forth
select mgs;
//loop you showed
var mg=来自中的mgs
其中mgs.Name==null | | mgs.Company==null/| |等等
选择mgs;
//你展示的循环
这听起来像是存储过程的工作。您不能通过SQL update语句来完成吗?但是我有5个字段需要检查它们是否为null,并且它们都不必同时为null。这里的一个字段可能为空,下一条记录的另一个字段可能为空,因此基本上我必须在100万条记录上运行5条update语句。。那要花很多时间。。我想……我不确定当您执行一百万次数据库往返时,优化字符串分配会有多大不同。@asawyer-对于一百万条记录,它将计数。但事实上,它无法解释3k记录的1分钟。当然,请注意,我从未测试过这一点,但在我看来,在等待db调用返回时,GC将有大量的停机时间运行。这不仅仅是GC。我已经演示了(…{s+=“…”;},它很快变得很重要。复制是O(n^2)
Yes这是一个很好的观点。我还突然想到,每次.Text
更新也会更新UI,但由于它处于一个紧密的循环中,消息泵很可能已经停止响应,因此完全消除字符串更新可能会有很大帮助,或者至少在循环完成后将它们移动到字符串生成器并更新一次UI。这正是我刚才所做的,我回来发布我的解决方案,但这里您使用的是相同的解决方案。按照你的建议,我的记录也从100万降到了1万。。不错:)最好的答案。。。