我有一个清单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();
现在,由于这些交叉点,我需要创建两个新列表,其中包含添加的项目(ae_alignedPartners_news - 交叉点)和删除的项目(ae_alignedPartners_olds - 交叉点)。这是代码:
// 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();
但对于很多记录(~100k)来说,花费了太多时间。
有没有一种Except<>
指定需要比较哪个键?就我而言,它不是p.ID
(哪一个是Primary Key
在数据库上),但是p.ObjectID
.
或者有其他更快的方法吗?
有一个Except https://learn.microsoft.com/en-us/dotnet/api/system.linq.enumerable.except?view=netframework-4.7.2您可以与自定义比较器一起使用的函数:
class PartnerComparer : IEqualityComparer<AE_AlignedPartners>
{
// Partners are equal if their ObjectID's are equal.
public bool Equals(AE_AlignedPartners x, AE_AlignedPartners y)
{
//Check whether the partner's ObjectID's are equal.
return x.ObjectID == y.ObjectID;
}
public int GetHashCode(AE_AlignedPartners ap) {
return ap.ObjectId.GetHashCode();
}
}
var intersect = ae_alignedPartners_news.Intersect(ae_alignedPartners_olds);
var creates = ae_alignedPartners_news.Except(intersect, new PartnerComparer);
var deletes = ae_alignedPartners_old.Except(intersect, new PartnerComparer);
这应该会给你带来合理的性能提升。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)