汎用EFリポジトリのAdd()メソッドに、挿入しようとしている行がテーブルにすでに存在するかどうかのチェックを実装しました。存在する場合は、現在利用可能な情報で更新します。
private List<T> _previousEntries;
//Try and find one with same PK in the temporary tables...
var previousRow = _previousEntries.Single(n => (int)n.GetType().GetProperty(_PKName).GetValue(n, null) == entPKValue);
//If we did find one...
if (previousRow != null)
{
//Update the row...
return;
}
//Add it...
ですから、私はリフレクションを使用しています。これは遅いですが、エンティティごとにSQL PK名が異なるため、別の方法は見つかりませんでした。
ただし、ここでリフレクションが最大の問題であるかどうかはわかりません。_previousEntriesが最大800,000個のアイテムを保持する場合があります。
_previousEntriesには、リポジトリクラスのクラスコンストラクタでアイテムが割り当てられています。_PKNameには、Tのタイプに応じて、クラスコンストラクターでも値が割り当てられます。
Single()ステートメントにブレークポイントを設定しただけでは、確実に2〜3秒間処理される可能性があるため、ここでボトルネックが何であるかを判断する方法がわかりません。800,000アイテムのリフレクションまたはSingle()です。 。5,000アイテムのリストでは確かにはるかに高速です。
何か意見はありますか?リストを最適化するためにできることはありますか?