#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
помощью of1
. Вы (очевидно) не можете прочитать какие-либо другие свойства объекта, поскольку они не были извлечены из базы данных. Но любые внесенные вами изменения будут применены с помощью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-запрос.