我有一个更新记录的查询;看起来有点像这样:
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中的运算符是什么?
感谢。
答案 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;
如果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
。
答案 2 :(得分:1)
以下技巧应该有效。
TheRecordToUpdate.TheDate = TheDate ?? TheRecordToUpdate.TheDate;
TheRecordToUpdate.TheAction = TheAction ?? TheRecordToUpdate.TheAction;
如果参数为null,则更新值但使用之前的值,因此它保留了之前的值。
答案 3 :(得分:0)
根据@ sarwar026,您可以使用三元更新到现在的状态,但我个人不喜欢它,它依赖于下游功能检测到的数据没有变化。
我只是把它包裹在if TheDate.HasValue
等等。看不出这个聪明的任何价值。