2

レコードを更新するクエリがあります。次のようになります。

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の演算子?

ありがとう。

4

4 に答える 4

5

??演算子を使用できます

TheRecordToUpdate.TheDate = TheDate ?? TheRecordToUpdate.TheDate ;

または、より明示的に記述したい場合

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

ただし、null 許容プロパティでない場合TheRecordToUpdate.TheDateは、次のように記述する必要があります。

if (TheDate.HasValue){
    TheRecordToUpdate.TheDate = TheDate.Value;
}
于 2012-05-06T12:24:21.083 に答える
2

??次のように演算子を使用してみることができます。

TheRecordToUpdate.TheDate = TheDate ?? TheRecordToUpdate.TheDate;

の場合、既存の値でフィールドを更新しTheDateますnull。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ます。

于 2012-05-06T12:23:49.227 に答える
1

次のトリックが機能するはずです。

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

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

于 2012-05-06T12:23:38.763 に答える
0

@ sarwar026のように、現在の状態に更新するために三項を使用できますが、個人的には好きではありませんが、ダウンストリーム機能によって検出されるデータに変更がないことに依存しています。私はそれをラップするだけif TheDate.HasValueです。これほど賢いことには何の価値もありません。

于 2012-05-06T12:27:12.220 に答える