0

汎用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アイテムのリストでは確かにはるかに高速です。

何か意見はありますか?リストを最適化するためにできることはありますか?

4

3 に答える 3

2

リフレクションをLINQステートメントの外に移動して、繰り返し評価されないようにすることができます。

var property = typeof(T).GetProperty(_PKName);
var previousRow = _previousEntries.Single(n => (int)property.GetValue(n, null) == entPKValue);

または、クラスコンストラクターにaを渡して、Func<T, int>リフレクションの必要性を完全に回避することもできます。

private Func<T, int> _getKeyForItem; // Set by constructor
...
var previousRow = _previousEntries.Single(n => _getkeyForItem(n) == entPKValue);
于 2012-11-27T21:42:08.570 に答える
1

デリゲートとして主キーアクセサーを提供する

public class Repository<T>
{
    private Funct<T,int> _getPK;
    private Dictionary<int,T> _previousEntries;

    public Repository(Funct<T,int> getPK)
    {
        _getPK = getPK;
        _previousEntries = new Dictionary<int,T>();
    }

    public void Add(T item) {
        ...
        int pk = _getPK(item);
        T previousEntry;
        if (_previousEntries.TryGetValue(pk, out previousEntry) {
            // Update
        } else {
            // Add
            _previousEntries.Add(pk, item);
        }
    }
}

このようなリポジトリを作成します

var clientRepository = new Repositiory<Client>(c => c.ClientID);
于 2012-11-27T21:49:29.870 に答える
0

ソートされていないリストをすばやく検索する方法はありません。O(アイテム数)になります。

検索を高速化するには、他のデータ構造を使用する必要があります。PKでソートされた辞書またはリストが可能なオプションです。

于 2012-11-27T21:42:55.497 に答える