【发布时间】:2019-02-01 08:40:38
【问题描述】:
我在数据库中有一个AE_AlignedPartners 项目列表,我使用以下方法检索:
List<AE_AlignedPartners> ae_alignedPartners_olds = ctx.AE_AlignedPartners.AsNoTracking().ToList();
然后,我得到并使用 JSON 序列化了一个新列表(具有相同的对象类型):
List<AE_AlignedPartners> ae_alignedPartners_news = GetJSONPartnersList();
比我得到两者的交集:
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();
现在,由于这些交叉点,我需要检查某些记录是否已更改,检查许多字段,然后添加到“监控”更新列表中。代码如下:
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)
{
AE_AlignedPartners toUpdate = mapper.Map<AE_AlignedPartners, AE_AlignedPartners>(itemNew);
toUpdate.ID = itemOld.ID;
ae_alignedPartners_toUpdate.Add(toUpdate);
}
}
这非常慢(大约 4 分钟发布,大约 7 万条记录)。
最近发现hereIEqualityComparer,确实加快了比较的进程。
在这种情况下我可以利用它吗?或者哪些是有效的优化?
我不会使用建议的FullOuterJoin,因为这意味着现在需要进行大量重构(我会在下一个项目中进行,保证)。
有什么建议吗?谢谢
【问题讨论】:
-
假设是相等比较特别导致了性能问题似乎是没有根据的。您是否对其进行了分析以查看实际花费最多的时间?从实际的 DB I/O 到过多的内存分配,再到对大型集合进行线性搜索的重复
.First()调用,这些比较可能会在我的可能候选列表中下降。 -
你已经实现了 嵌套循环
foreach (...) {..First(...)}: 所以你有O(N ** 2)时间复杂度70k * 70k ~ 5e9循环很慢。让我们把ae_alignedPartners_olds和ae_alignedPartners_news变成一个带有ObjectID键的字典 -
@DmitryBychenko:你能举个例子吗?
-
ObjectID是int? -
@Rango: 不是字符串
标签: c# .net performance linq