2012-05-06 16 views
2

レコードを更新するクエリがあります。linq-to-SQLの条件付き更新

public void SaveRecord(int TheUserID, Nullable<DateTime> TheDate, 
                Nullable<int> TheAction) 
    { 
     using DC... 
     { 
     var TheRecordToUpdate = (from....where .... 
            select l).Single(); 

     TheRecordToUpdate.TheDate = TheDate; 
     TheRecordToUpdate.TheAction = TheAction; 

     TheDC.SubmitChanges(); 

問題は時々私がnullパラメータを供給し、それが事実だとき、私はDB内のフィールドを変更したくないということである:それは多少このようになります。どうすれば?パラメータがnullの場合、linq-to-sqlの演算子?

ありがとうございました。

答えて

5

あなたは??オペレータ

TheRecordToUpdate.TheDate = TheDate ?? TheRecordToUpdate.TheDate ; 

またはあなたがより明示的

if (TheDate.HasValue){ 
    TheRecordToUpdate.TheDate = TheDate; 
} 

それを書きたい場合TheRecordToUpdate.TheDateしかしNULL可能プロパティではない場合、あなたは

を記述する必要がありますを使用することができます
if (TheDate.HasValue){ 
    TheRecordToUpdate.TheDate = TheDate.Value; 
} 
+0

+1 2番目のオプションです。 – leppie

+0

@leppie最初のオプションで何が間違っていますか? –

+0

私からも。ダウンストリームの暗黙的な動作に頼るのではなく、独自のコードでインテントをクリアします。 –

1

次のトリックが有効です。

TheRecordToUpdate.TheDate = TheDate ?? TheRecordToUpdate.TheDate; 
TheRecordToUpdate.TheAction = TheAction ?? TheRecordToUpdate.TheAction; 

パラメータがnullの場合、値は更新されますが以前の値に変更され、以前の値が保持されます。

2

あなたはこのよう??演算子を使用するように試みることができる:TheDatenullある場合

TheRecordToUpdate.TheDate = TheDate ?? TheRecordToUpdate.TheDate; 

それは、既存の値を持つフィールドを更新します。 LINQのデザイナーとSQL金属が同じ値を割り当てるに対して警備員が含まれているので、これは、データベースの更新をトリガべきではありませんによって生成されたコード:

set 
{ 
    if ((this._TheDate != value)) 
    { 
    this.OnTheDateChanging(value); 
    this.SendPropertyChanging(); 
    this._TheDate = value; 
    this.SendPropertyChanged("TheDate"); 
    this.OnTheDateChanged(); 
    } 
} 

とにかく、私は通常のif文を使用すると、より読みやすいと思います

if (TheDate != null) 
{ 
    TheRecordToUpdate.TheDate = TheDate; 
} 

補足として、変数の通常の大文字表記規則に従わないことになります。 TheDateパラメータは通常theDateと書かれています。

+0

自動生成されたコードを編集するのは本当に心地よいですが、それは可能性があると私は知っています。答えをありがとう。そのルートに行く必要がある/したがっている場合に備えてupvoted。 – frenchie

+0

@frenchie:自動生成されたコードを編集する必要はなく、同じ値が再割り当てされたときにlinq-to-sqlがデータベースを更新しないことを示すためには、 –

0

これまでのように、ternaryを使用して更新することができます@ sarwar026、個人的に私はそれが好きではない、それはダウンストリームの機能によって検出されているデータに変更に依存していません。 私はちょうどif TheDate.HasValueなどでそれをラップしたいと思います。