2012-05-06 5 views
2

У меня есть запрос на обновление записи; это выглядит примерно так:linq-to-sql update условно

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, когда параметр равен нулю?

Спасибо.

ответ

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; 

Было бы обновить поле с существующим значением, если 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.

+0

Мне не очень удобно редактировать автоматически сгенерированный код, но я знаю, что это возможность. Спасибо за ответ; если кто-то хочет/должен идти по этому маршруту. – frenchie

+0

@frenchie: Я не хочу, чтобы вы отредактировали автоматически сгенерированный код, просто хотел показать, как он выглядит, чтобы указать, что linq-to-sql не будет обновлять базу данных при переназначении того же значения. –

0

Вы можете использовать тройную версию для обновления до того, что она сейчас представляет @ sarwar026, мне лично это не нравится, но оно не зависит от данных, обнаруженных нисходящими функциями. Я бы просто обернул его в if TheDate.HasValue и т. Д. Не вижу никакой ценности в том, чтобы быть таким умным.

Смежные вопросы