Обновление в LINQ с одним обращением к базе данных?

#c# #sql #linq #ado.net #sql-update

#c# #sql #linq #ado.net #sql-обновление

Вопрос:

Мне трудно разобраться, когда LINQ обращается к базе данных, и как он узнает, когда будет оптимальное время. В основном, это заявление об ОБНОВЛЕНИИ, по-видимому, совершает два обращения к базе данных. Но этого не должно быть — похоже, в LINQ нет эквивалента «обновления», если не считать запроса строки, ее обновления и последующего сохранения этого изменения. В базовом SQL я должен быть в состоянии ОБНОВИТЬ WHERE одним махом.

 var query = from u in db.users where u.id == 1 select u;
foreach (user u in query)
{
   u.name = "JOE";
}
db.Save();
 

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

Мысли? Идеи?

Редактировать

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

Ответ №1:

Если id это первичный ключ, вы можете использовать:

 var u = new user { id = 1 };
db.users.Attach(u);
u.name = "JOE";
db.SubmitChanges();
 

Комментарии:

1. Attach не совершает переход к базе данных, чтобы выяснить, какая строка присоединяется?

2. Нет, в этом нет необходимости. Он знает, что вы ссылаетесь на user с id помощью of 1 . Вы (очевидно) не можете прочитать какие-либо другие свойства объекта, поскольку они не были извлечены из базы данных. Но любые внесенные вами изменения будут применены с помощью UPDATE команды.

3. Это здорово. Есть ли локальный, который я могу проверить с помощью точки останова, чтобы узнать, что такое SQL-запрос на самом деле?

4. Если вы создадите столбец метки времени и установите user { id = 1, timetamp = savedTimestamp, }; , вы также получите проверку параллелизма в автономном режиме.

5. @CarlBenson, вы можете ввести myDbContext.Log = Console.Out; , чтобы каждый SQL-запрос, сгенерированный linq2sql, печатался в окне вывода в Visual Studio.

Ответ №2:

Взгляните на одно из пользовательских расширений Linq, например, это http://www.aneyfamily.com/terryandann/post/2008/04/Batch-Updates-and-Deletes-with-LINQ-to-SQL.aspx . У вас есть DeleteBatch и UpdateBatch методы там. В частности, UpdateBatch принимает условие и обновляющее выражение и выполняется как один SQL-запрос.