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();

问题是有时我提供空参数,在这种情况下,我不想更改数据库中的字段。我该如何使用??当参数为空时,linq-to-sql 中的运算符?

谢谢。

4

4 回答 4

5

您可以使用??运算符

TheRecordToUpdate.TheDate = TheDate ?? TheRecordToUpdate.TheDate ;

或者如果您想更明确地编写它

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

但是,如果TheRecordToUpdate.TheDate不是可为空的属性,则必须编写

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

您可以尝试??像这样使用运算符:

TheRecordToUpdate.TheDate = TheDate ?? TheRecordToUpdate.TheDate;

TheDate如果is ,它将使用现有值更新字段null。linq 设计器和 SQL metal 生成的代码包含防止分配相同值的措施,因此这不应触发数据库更新:

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;

如果参数为空,则值会更新但使用先前的值,因此它保留其先前的值。

于 2012-05-06T12:23:38.763 回答
0

您可以根据@sarwar026 使用三元更新到现在的状态,但我个人不喜欢它,它依赖于下游功能检测到的数据没有变化。我只是把它包起来if TheDate.HasValue。看不出这么聪明有什么价值。

于 2012-05-06T12:27:12.220 回答