2017-02-15 12 views
0

名前と優先度の2つの列を持つテーブルがあります。現在のデータを(A、1)(B、2)(C、3)(D、4)としましょう。SQL Serverテーブルの2つの値を交換します。

私はDから優先度を2に更新し、Bの優先度を4に設定します。 B.私はこれをどのようにするのですか?私のプロジェクトはEntityフレームワークを使用します。これは

public void Swap(InputObject input) 
     { 
      NamePriority prio = context.NamePriorities.Where(w => w.Name == input.Name.FirstOrDefault(); 
      NamePriority prioToSwap = context.NamePriorities.Where(w.Priority == input.Priority).FirstOrDefault(); 
      prioToSwap.Priority = prio.Priority; 
      context.SaveChanges(); 
      prio.Priority = input.Priority; 
      context.SaveChanges(); 
     } 

は、LINQのラムダ式か何かを使っているようにこれを行うには単純やきれいな方法がありますが、私は現在やっている方法ですか?

+1

変更を2回保存する必要はありません。データベースから再度取得する場合の値は反映されません。あなたが達成しようとしているのは、通常のスワップではありませんか? int a = 3、int b = 2、int temp = 0と同じです。 temp = a; a = b; b = tmp? – Zinov

答えて

1

SaveChangesへの最初の呼び出しを削除すると、そのようになります。あなたがやっていることは、変更、変更、変更の保存の2つのオブジェクトを選択することです。コードを簡単にすることはできません。

ただし、いずれかまたは両方のオブジェクトがデータベースに見つからない可能性があることに注意してください。

public void Swap(InputObject input) 
{ 
    NamePriority prio = 
     context.NamePriorities 
      .Where(w => w.Name == input.Name).FirstOrDefault(); 

    if (prio == null) return; // This was missing 

    NamePriority prioToSwap = 
     context.NamePriorities 
      .Where(w.Priority == input.Priority).FirstOrDefault(); 

    if (prioToSwap == null) return; // This was missing 

    prioToSwap.Priority = prio.Priority; 
    prio.Priority = input.Priority; 

    context.SaveChanges(); 
} 

このコードを少し混乱させる部分は、オブジェクトを選択することです。これが本当にあなたが従わなければならないドメインロジックなら、それだけです。

スワップが必要な2つのオブジェクトの選択基準を簡略化しようとすると、それがすべて推奨できます。

代替ソリューション

それは間違ったツールを使用して問題を解決するかもしれないというのが私の心を横切ります。

デザインの優先順位は何ですか?あなたの例から、最後に更新されたオブジェクトを宣伝しているようです。

各オブジェクトを名前と最後の更新のタイムスタンプ(最初は挿入時間)で表現するのではなく、なぜ優先順位を維持するのでしょうか?

この組織がドメインロジックを満たしている場合、オブジェクトの優先順位付けは明示的な優先順位ではなくタイムスタンプで降順にソートし、この全体を削除することができます。Swap

+0

ええ、用語はこの質問に混乱しています。優先権という用語は通常、値が相互に排他的であることを意味するものではありません。一意の値を持つことはランクを意味するかもしれませんが、私はこの例ではB = 3、C = 4を期待しています。 – Ehz

関連する問題