Как обновить Linq-To-SQL?

Мне нужно обновить значения, но я зациклирую все значения таблиц, чтобы сделать это:

public static void Update(IEnumerable<Sample> samples
    , DataClassesDataContext db)
{
    foreach (var sample in db.Samples)
    {
        var matches = samples.Where(a => a.Id == sample.Id);
        if(matches.Any())
        {
            var match = matches.First();
            match.SomeColumn = sample.SomeColumn;
        }
    }
    db.SubmitChanges();
}

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

Ответы

Ответ 1

Да, есть более простой способ. Гораздо проще. Если вы присоедините свои сущности к контексту, а затем Refresh (с выбранными KeepCurrentValues), Linq to SQL получит эти объекты с сервера, сравните их и отметьте обновленными те, которые отличаются. Ваш код будет выглядеть примерно так.

public static void Update(IEnumerable<Sample> samples
    , DataClassesDataContext db)
{
    db.Samples.AttachAll(samples);
    db.Refresh(RefreshMode.KeepCurrentValues, samples)
    db.SubmitChanges();
}

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

Ответ 2

С Linq2Sql (или Linq to Entities) нет способа * обновлять записи на сервере, не загружая их полностью, поэтому то, что вы делаете, действительно правильно.

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

Я не совсем уверен, что это был ваш предполагаемый вопрос:)

*: Есть некоторые хаки, которые используют LINQ для создания инструкции SELECT и каким-то образом обрабатывают результирующий оператор SELECT в UPDATE, но я бы не рекомендовал его.