2012-05-06 70 views
2

我有一個查詢來更新記錄;它看起來有點像這樣: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中的運算符?

謝謝。

回答

5

可以使用??操作

TheRecordToUpdate.TheDate = TheDate ?? TheRecordToUpdate.TheDate ; 

,或者如果你想更明確地

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

如果TheRecordToUpdate.TheDate是不是爲空的屬性但是寫的,你得寫

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

第二個選項爲+1。 – leppie

+0

@leppie第一個選項有什麼問題? –

+0

從我也是。在您自己的代碼中清除意圖,而不是依賴下游某種隱式行爲。 –

1

以下的技巧應該可以工作。

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

如果參數爲空,那麼值將被更新,但會與之前的值一起更新,因此它會保留其先前的值。

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

+0

我不覺得編輯自動生成的代碼真的很舒服,但我知道這是一種可能性。感謝你的回答;如果有些人想要/需要走這條路線,可以投票贊成。 – frenchie

+0

@frenchie:我不是說你應該編輯自動生成的代碼,只是想表明linq-to-sql在重新分配相同的值時不會更新數據庫。 –

0

您可以使用三元來更新它現在的效果@ sarwar026,我個人並不喜歡它,它依賴於下游功能檢測到的數據沒有變化。 我只是把它包裝在if TheDate.HasValue等。在這個聰明的看不出任何價值。