Обновление нескольких строк Linq vs SQL

17

Некоторое время назад я написал фрагмент кода для обновления нескольких строк в таблице базы данных. Код был таким:

var db = new MyDataContext();
db.Execute("UPDATE Details SET IsActive = 0 WHERE MasterId = 1");

Тогда на днях, когда я получил последнюю версию файла, я увидел, что кто-то изменил код на что-то вроде этого

var details = from d in db.details where d.MasterId == 1 select d;
foreach (var detail in details)
  detail.IsActive = false;
db.SubmitChanges();

Итак, мой вопрос: какой лучший способ обновить несколько строк? Использование Linq или SQL?

    
задан Marioh 08.12.2008 в 01:32
источник

5 ответов

14

Проверьте подход, используемый в этой статье:

ответ дан CMS 08.12.2008 в 01:50
источник
  • Ссылка не работает –  Richard Pursehouse 31.07.2014 в 14:51
  • Вот рабочая ссылка: terryaney.wordpress.com/2008/04/14/... –  Pavel Yermalovich 31.01.2015 в 11:03
9

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

    
ответ дан tvanfosson 08.12.2008 в 01:42
источник
  • Я не добавлю лишнего ответа - я думаю, что если вы хотите получить ответ, тогда это должен быть SQL для операции с множеством, т. е. вы хотите повлиять на множество строк с помощью одного оператора, но, как вы говорите это действительно компромисс, какой компромисс вы хотите сделать. –  Murph 18.11.2009 в 21:05
4

PLINQO реализовала пакетные обновления и удаляет, и каждый объект, сгенерированный plinqo, может использовать операции пакетного обновления и удаления.

context.Task.Update(t => t.Id == 1, t2 => new Task {StatusId = 2});

Это будет выполнять Update Task Set StatusId = 2 Where Id = 1

    
ответ дан Shannon Davidson 11.11.2009 в 22:49
источник
1
for (int i = 0; i < pListOrderDetail.Count; i++)
{
    for (int j = 0; j < stempdata.Count; j++)
    {
        pListOrderDetail[i].OrderID = pOrderID;
        pListOrderDetail[i].ProductID = stempdata[j].pProductID;
        pListOrderDetail[i].Quantity = stempdata[j].pQuantity;
        pListOrderDetail[i].UnitPrice = stempdata[j].pUnitPrice;
        pListOrderDetail[i].Discount = stempdata[j].pDiscount;
        db.SubmitChanges();
        break;
    }
    continue;
}
    
ответ дан beautiful-theme.com 28.07.2010 в 19:48
источник
0

В версии Linq-to-SQL будет SELECT каждой строки из таблицы details , которая соответствует запросу, вытаскивает их в память и создает для них объекты. Затем, когда он применяет обновления, он будет использовать отдельный оператор UPDATE для каждого объекта и будет (по умолчанию) включать предложение WHERE , которое проверяет значение каждого столбца, чтобы убедиться, что оно не изменилось с тех пор, как вы сделали код%. Если строка изменилась, Linq выдает исключение.

Версия Linq для кода будет MUCH медленнее (думаю, на 100x или 1000x медленнее), и предоставит вам дополнительные исключения.

Версия SQL может быть немного сложнее поддерживать в качестве кода рефакторинга в будущем, но это сделает мир различий в вашей базе данных.

Я обычно чувствую, что Linq-to-SQL отлично подходит для выборок и отдельных обновлений, и, возможно, для небольших партий база данных будет достаточно быстрой, чтобы дополнительные запросы не были проблемой, но я должен был бы тщательно подумать, прежде чем я использовал Linq для больших партий или на веб-сервере.

    
ответ дан Rory MacLeod 11.01.2012 в 12:21
источник