Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.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# 如何优化此创建/更新/删除比较?_C#_.net_Performance_Linq_Entity Framework 6 - Fatal编程技术网

C# 如何优化此创建/更新/删除比较?

C# 如何优化此创建/更新/删除比较?,c#,.net,performance,linq,entity-framework-6,C#,.net,Performance,Linq,Entity Framework 6,我是EF6的 我在数据库中有一个当前项列表,我用以下方法检索该列表: ae_alignedPartners_olds = ctx.AE_AlignedPartners.AsNoTracking().ToList(); // list of List<AE_AlignedPartners> ae_alignedPartners\u olds=ctx.ae_alignedPartners.AsNoTracking().ToList();//名单 然后,我从JSON中重试相同的对象,使

我是EF6的

我在数据库中有一个当前项列表,我用以下方法检索该列表:

ae_alignedPartners_olds = ctx.AE_AlignedPartners.AsNoTracking().ToList(); // list of List<AE_AlignedPartners>
ae_alignedPartners\u olds=ctx.ae_alignedPartners.AsNoTracking().ToList();//名单
然后,我从JSON中重试相同的对象,使用:

ae_alignedPartners_news = GetJSONListObjects(); // list of List<AE_AlignedPartners>
ae_alignedPartners_news=GetJSONListObjects();//名单
然后我进行了一些比较(以查看哪些需要更新,哪些需要删除,哪些需要创建。这是当前代码:

// intersection
var IDSIntersections = (from itemNew in ae_alignedPartners_news
                        join itemOld in ae_alignedPartners_olds on itemNew.ObjectID equals itemOld.ObjectID
                        select itemNew).Select(p => p.ObjectID).ToList();

// to update
IList<AE_AlignedPartners> ae_alignedPartners_toUpdate = new List<AE_AlignedPartners>();
foreach (var item in IDSIntersections)
{
    var itemOld = ae_alignedPartners_olds.First(p => p.ObjectID == item);
    var itemNew = ae_alignedPartners_news.First(p => p.ObjectID == item);

    if (itemOld.Field1 != itemNew.Field1 ||
        itemOld.Field2 != itemNew.Field2 ||
        itemOld.Field3 != itemNew.Field3 ||
        itemOld.Field4 != itemNew.Field4 ||
        itemOld.Field5 != itemNew.Field5 ||
        itemOld.Field6 != itemNew.Field6 ||
        itemOld.Field7 != itemNew.Field7 ||
        itemOld.Field8 != itemNew.Field8 ||
        itemOld.Field9 != itemNew.Field9)
    {
        itemOld.Field1 = itemNew.Field1;
        itemOld.Field2 = itemNew.Field2;
        itemOld.Field3 = itemNew.Field3;
        itemOld.Field4 = itemNew.Field4;
        itemOld.Field5 = itemNew.Field5;
        itemOld.Field6 = itemNew.Field6;
        itemOld.Field7 = itemNew.Field7;
        itemOld.Field8 = itemNew.Field8;
        itemOld.Field9 = itemNew.Field9;

        ae_alignedPartners_toUpdate.Add(itemOld);
    }
}

// to create
IList<AE_AlignedPartners> ae_alignedPartners_toCreate = ae_alignedPartners_news.Where(p => !IDSIntersections.Contains(p.ObjectID)).ToList();

// to delete
IList<AE_AlignedPartners> ae_alignedPartners_toDelete = ae_alignedPartners_olds.Where(p => !IDSIntersections.Contains(p.ObjectID)).ToList();
//交叉点
var idscomps=(来自ae_alignedPartners_新闻中的itemNew)
在itemNew.ObjectID上的ae_alignedPartners_olds中加入itemOld等于itemOld.ObjectID
选择itemNew.select(p=>p.ObjectID.ToList();
//更新
IList ae_alignedPartners_toUpdate=新列表();
foreach(ids中的变量项)
{
var itemOld=ae\u alignedPartners\u olds.First(p=>p.ObjectID==item);
var itemNew=ae\u alignedPartners\u news.First(p=>p.ObjectID==item);
如果(itemOld.Field1!=itemNew.Field1||
itemOld.Field2!=itemNew.Field2||
itemOld.Field3!=itemNew.Field3||
itemOld.Field4!=itemNew.Field4||
itemOld.Field5!=itemNew.Field5||
itemOld.Field6!=itemNew.Field6||
itemOld.Field7!=itemNew.Field7||
itemOld.Field8!=itemNew.Field8||
itemOld.Field9!=itemNew.Field9)
{
itemOld.Field1=itemNew.Field1;
itemOld.Field2=itemNew.Field2;
itemOld.Field3=itemNew.Field3;
itemOld.Field4=itemNew.Field4;
itemOld.Field5=itemNew.Field5;
itemOld.Field6=itemNew.Field6;
itemOld.Field7=itemNew.Field7;
itemOld.Field8=itemNew.Field8;
itemOld.Field9=itemNew.Field9;
ae_alignedPartners_toUpdate.Add(itemOld);
}
}
//创造
IList ae_alignedPartners_to create=ae_alignedPartners_news.Where(p=>!idscomps.Contains(p.ObjectID)).ToList();
//删除
IList ae_alignedPartners_toDelete=ae_alignedPartners_olds.Where(p=>!idscomps.Contains(p.ObjectID)).ToList();
速度足够快,可以容纳1000条记录。超过50k,速度会变得非常慢


您建议如何改进整体性能?

如果您想找出什么是缓慢的,我建议对调试器进行评测,或者简单地暂停调试器10次,以查看它最常停止的位置(您可以使用现有代码进行尝试)。但在这里,我可以立即发现问题:

var itemOld = ae_alignedPartners_olds.First(p => p.ObjectID == item);
var itemNew = ae_alignedPartners_news.First(p => p.ObjectID == item);
这是扫描整个列表,它是O(N),与外部循环一起成为O(N^2)


最好的解决方案是重新构造查询,这样就不需要这些查找。在我看来,连接已经输出了您需要的对象

但您也可以使用哈希表来加快查找速度

var dict_ae_alignedPartners_olds = ae_alignedPartners_olds.ToDictionary(p => p.ObjectID);
var dict_ae_alignedPartners_news = ae_alignedPartners_news.ToDictionary(p => p.ObjectID);

foreach (var item in IDSIntersections)
{
    var itemOld = dict_ae_alignedPartners_olds[item];
    var itemNew = dict_ae_alignedPartners_news[item];
    //...
}

“在我看来,连接已经输出了您需要的对象。”它向我提供了兴趣部分。但如果元素本身(即所有字段)是否已被编辑,则不会。我需要检查…@markzzz,您可以说
选择新建{itemNew,oldItem}
。我个人也会将循环拉入查询。
ae\u alignedPartners\u toUpdate=[join query here]。其中(x=>{…})。选择(x=>{…})。ToList()
。根据我的经验,这更有效。循环更难更改,强制产生副作用,通常是更多的代码,代码更难移动和重用。我不明白你的建议。你能给我看一段代码吗?老实说,转换代码的工作量太大了。你可以在LINQ查询中重写整个循环。“添加到集合”是“选择”,而“筛选”是“在哪里”。