Как обновить 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, но я бы не рекомендовал его.