Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# LINQ更新表将NULL替换为EmptyString 100万条记录_C#_Linq_Time_Records - Fatal编程技术网

C# LINQ更新表将NULL替换为EmptyString 100万条记录

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 )

我一直在尝试更新一个有100万条记录的表,并将其中4个字段的空值替换为空字符串(“”)。Foreach和for似乎需要很长时间。我花了1分钟更新了3000条记录。是否有更简单的方法使用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();
}
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万。。不错:)最好的答案。。。