Обновление нескольких строк Linq против SQL - PullRequest
17 голосов
/ 08 декабря 2008

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

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?

Ответы [ 5 ]

14 голосов
/ 08 декабря 2008

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

9 голосов
/ 08 декабря 2008

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

4 голосов
/ 12 ноября 2009

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

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

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

1 голос
/ 28 июля 2010
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;
}
0 голосов
/ 11 января 2012

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

Версия кода на Linq будет НАМНОГО медленнее (например, в 100 или 1000 раз медленнее) и предоставит вам дополнительные исключения.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...