1

データベースに入力したいオブジェクトの配列があります。私のメソッド呼び出しは次のようになります。

public void Add(CardElement[] cardElements){
    foreach (var cardElement in cardElements)
    {
        Data.Entry(cardElement).State = System.Data.EntityState.Added;
    }
    Data.SaveChanges();
}

データベーステーブルはこれに似ています

MS SQL = Table mytable Columns a,b,c,d,e,f
Unique Constraint a,b,c 

挿入したいデータはこれに似ています。

var obj []  = new [] { 
   new MyObject () { a = 1, b =1, c = 1 },
   new MyObject () { a = 1, b =1, c = 2 }
   new MyObject () { a = 1, b =1, c = 3 }
 };

したがって、これらの3つの行をデータベースに追加する前に、データベースでこれらの3つの行を確認したいと思います。

私は次のようなことをすることができますが、これはデータベースへの余分なトリップを引き起こすはずだと思います。

private bool checkExists()...

foreach (var cardElement in cardElements)
{
    var exists = (from ce in Data.CardElements
                    where ce.CardId == cardElement.CardId
                    where ce.Area == cardElement.Area
                    where ce.ElementName == cardElement.ElementName
                    select ce).Any();
    if(exists return true)
}
return false
  1. では、どうすればこれをより優雅に処理できますか?
  2. linqを使用してこれを達成しようとする価値さえありますか?
  3. パフォーマンスのためにいくつかのストアドプロシージャを作成する必要がありますか?
4

3 に答える 3

1

私はあなたがdbに決定をさせるべきであることに同意します。この投稿に記載されているUPSERTの使用をご覧ください

于 2012-06-01T09:36:14.510 に答える
0

挿入を試みて、(try / catchを使用して)一意の制約違反が発生したかどうかをデータベースに通知させないのはなぜですか?

于 2012-06-01T07:42:42.740 に答える
0

問題は、データをクエリした場合でも、他の誰かがクエリと変更の保存の間にレコードを挿入できることです。追加のクエリにもかかわらず、一意の制約に違反した場合の例外を処理する必要があります。もちろん、すべてのチェックでデータベースへの追加のアクセスが行われます。

主な関心事がパフォーマンスである場合は、ストアドプロシージャを使用します。このストアドプロシージャでは、テーブルヒントを使用して、存在の初期チェック中に挿入用のテーブルをロックできます。

于 2012-06-01T08:38:36.693 に答える