我正在从另一个数据库导入数据。自定义对象的大集合Intersection()和Except()速度太慢
我的过程是进口从远程数据库的数据为List<DataModel>
名为remoteData
和进口也从本地DB数据到一个名为localData
List<DataModel>
。
然后,我使用LINQ创建不同的记录列表,以便我可以更新本地数据库以匹配从远程数据库中提取的数据。就像这样:
var outdatedData = this.localData.Intersect(this.remoteData, new OutdatedDataComparer()).ToList();
我然后使用LINQ创建一个记录列表,在remoteData
不复存在,但在localData
确实存在,使我从本地数据库中删除。
像这样:
var oldData = this.localData.Except(this.remoteData, new MatchingDataComparer()).ToList();
我然后使用LINQ做上述相反的新数据添加到本地数据库。
像这样:
var newData = this.remoteData.Except(this.localData, new MatchingDataComparer()).ToList();
每个收集进口约70K的记录,每5之间的3 LINQ操作起跳 - 10分钟完成。 如何让这个更快?
这里是集合使用对象:
internal class DataModel
{
public string Key1{ get; set; }
public string Key2{ get; set; }
public string Value1{ get; set; }
public string Value2{ get; set; }
public byte? Value3{ get; set; }
}
用于检查过时的记录的比较器:
class OutdatedDataComparer : IEqualityComparer<DataModel>
{
public bool Equals(DataModel x, DataModel y)
{
var e =
string.Equals(x.Key1, y.Key1) &&
string.Equals(x.Key2, y.Key2) && (
!string.Equals(x.Value1, y.Value1) ||
!string.Equals(x.Value2, y.Value2) ||
x.Value3 != y.Value3
);
return e;
}
public int GetHashCode(DataModel obj)
{
return 0;
}
}
用来寻找新老记录的比较器:
internal class MatchingDataComparer : IEqualityComparer<DataModel>
{
public bool Equals(DataModel x, DataModel y)
{
return string.Equals(x.Key1, y.Key1) && string.Equals(x.Key2, y.Key2);
}
public int GetHashCode(DataModel obj)
{
return 0;
}
}
你应该真的* *实现的哈希码。 –
哈希码用于查找哈希表中的对象,这可能是Except和Intersect在内部用来查找匹配对象的原因。通过返回一个常数值,所有对象将具有相同的位置,并且匹配搜索将降级为所有候选中的线性搜索。您需要基于用于相等的属性正确实现'GetHashCode'。 – Lee
正确。我添加了一个哈希码,并且该操作需要一秒钟!谢谢。 – Theo