linq-to-sql有条件地更新

时间:2012-05-06 12:20:50

标签: c# 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时,linq-to-sql中的运算符是什么?

感谢。

4 个答案:

答案 0 :(得分:5)

您可以使用??运算符

TheRecordToUpdate.TheDate = TheDate ?? TheRecordToUpdate.TheDate ;

或者如果你想更明确地写它

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

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

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

答案 1 :(得分:2)

您可以尝试使用??运算符,如下所示:

TheRecordToUpdate.TheDate = TheDate ?? TheRecordToUpdate.TheDate;

如果TheDatenull,它会使用现有值更新字段。 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

答案 2 :(得分:1)

以下技巧应该有效。

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

如果参数为null,则更新值但使用之前的值,因此它保留了之前的值。

答案 3 :(得分:0)

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