有条件地更新 Linq-to-SQL

本文关键字:Linq-to-SQL 更新 有条件 | 更新日期: 2023-09-27 18:33:29

我有一个查询来更新记录;它看起来有点像这样:

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 中使用运算符?

谢谢。

有条件地更新 Linq-to-SQL

您可以使用??运算符

TheRecordToUpdate.TheDate = TheDate ?? TheRecordToUpdate.TheDate ;

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

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

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

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

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

TheRecordToUpdate.TheDate = TheDate ?? TheRecordToUpdate.TheDate;

如果TheDate 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

下面的技巧应该有效。

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

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

你可以根据

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