2010-06-02 6 views
5

Мне нужна помощь в повторной факторизации этого старого кода LINQ-SQL, который генерирует около 100 операторов обновления.LINQ-SQL Обновление нескольких строк в одной транзакции

Я продолжу играть с лучшим решением, но буду благодарен за некоторые идеи/прошлый опыт в этой проблеме.

Вот мой код:

List<Foo> foos; 
int userId = 123; 

using (DataClassesDataContext db = new FooDatabase()) 
{ 
    foos = (from f in db.FooBars 
      where f.UserId = userId 
      select f).ToList(); 

    foreach (FooBar fooBar in foos) 
    { 
     fooBar.IsFoo = false; 
    } 

    db.SubmitChanges() 
} 

По существу я хочу обновить IsFoo поле к ложным для всех записей, которые имеют особое значение UserId.

Что происходит это .ToList() является стреляя запрос, чтобы получить все FooBars для конкретного пользователя, то для каждого объекта Foo, его выполнение в UPDATE о обновляя IsFoo собственности.

Может ли вышеуказанный код быть переупознано с одним заявлением UPDATE?

В идеале, только SQL я хочу уволил это ниже:

UPDATE FooBars 
SET IsFoo = FALSE 
WHERE UserId = 123 

EDIT

Ok так похоже, что не могу быть сделано без использования db.ExecuteCommand.

Grr ...!

Что я, вероятно, в конечном итоге сделаю, это создание другого метода расширения для пространства имен DLINQ. Все еще требуется некоторая жесткая кодировка (например, запись «WHERE» и «UPDATE»), но по крайней мере она скрывает большинство деталей реализации от фактического синтаксиса запроса LINQ.

+0

Я не думаю, что вы можете сделать это в одной транзакции. – VoodooChild

ответ

2

Проверить DataClassesDataContext.ExecuteCommand ...

+0

Я видел некоторые примеры этого - но разве это не означает «жесткое кодирование» SQL как строки и передачу этого метода ExecuteCommand? Мысль о точке LINQ-SQL заключалась в том, чтобы абстрагироваться от базовых деталей базы данных. – RPM1984

+0

Вы правы. Только причина здесь - производительность. Не нужно получать все данные в ваше приложение и обратно только для простого обновления. Если у вас более 100 сущностей разница будет очень большой ... – Marko

+0

Yep - только способ пойти кажется. Я был опечален, увидев, что эта проблема существует и в EF. – RPM1984

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