別のデータベースからデータをインポートしています。
私のプロセスは、リモートDBからList<DataModel>
名前付きremoteData
にデータをインポートし、ローカルDBからList<DataModel>
名前付きにデータをインポートしていlocalData
ます。
次に、LINQ を使用して異なるレコードのリストを作成し、リモート DB から取得したデータと一致するようにローカル DB を更新できるようにします。このような:
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();
各コレクションは約 70,000 レコードをインポートし、3 つの LINQ 操作のそれぞれが完了するまでに 5 ~ 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;
}
}