В LinqToSql очень легко загрузить строку, изменить столбец и отправить изменения в базу данных:
using (MyDataContext wdc = new MyDataContext())
{
Article article = wdc.Article.First(p => p.ID == id);
article.ItemsInStock = itemsinstock;
wdc.SubmitChanges();
}
Единственный недостаток: статья огромная. Чтобы загрузить всю статью, достаточно обновить только один столбец. и значительно замедляет работу моего приложения.
Есть ли способ обновить один столбец с помощью LINQ без необходимости загружать всю строку?
Прямо сейчас я возвращаюсь к ExecuteCommand, где скорость важна, но это некрасиво и подвержено ошибкам:
wdc.ExecuteCommand("UPDATE Article SET ItemsInStock = @1 WHERE ID = @2", itemsinstock,id);





Вам нужно установить UpdateCheck для всех свойств класса Article, кроме первичного ключа (щелкните свойство класса в конструкторе LINQ2SQL и переключитесь в окно инструментов свойств) на Never (не уверен насчет WhenChanged, возможно, это тоже работает - продолжайте и экспериментируйте с Это!).
Это заставит LINQ2SQL использовать
UPDATE ... SET ... WHERE ID = @2
вместо длинной версии со всеми столбцами в предложении WHERE:
UPDATE ... SET ... WHERE ID = @2 AND ItemsInStock = @1 AND SomeOtherColumn = @3 AND...
Теперь вы можете использовать такой код, как
context.Articles.Attach(article /* article with updated values */, new Article { ID = articleID, ItemsInStock = -1 } /* pretend that this is the original article */);
context.SubmitChanges();
В основном вы указываете, что изменилось только свойство ItemsInStock - другие свойства должны иметь такое же значение по умолчанию, конечно же, articleID.
ПРИМЕЧАНИЕ: вам не нужно получать статью до этого.
Как я уже указывал, вам не нужно извлекать сущность только для обновления.
Ах да, теперь я понимаю. Однако потребуется создать специальную версию моих классов данных.
В этом нет необходимости. Просто передайте ID и ItemsInStock в метод вашего репозитория. Вы можете создать 2 новых объекта для context.Articles.Attach () - первый с измененными значениями, последний с поддельными значениями, например. ItemsInStock = -1.
По-прежнему изменение всех свойств на «никогда не проверять» не подходит для моего общего DataContext. Но вы дали мне идею очень-очень простого решения: создать новый DataContext только для этого экземпляра, который содержит только столбцы, которые я хочу обновить. Большой!
Я даже не знал о методе Attach (), и для меня это определенно предпочтительное решение. Я включил его в свою статью о различных решениях этой проблемы devio.wordpress.com/2011/01/16/…
ligget78 дал мне еще одну идею, как сделать обновление одного столбца:
Создайте новый DataContext только для такого рода обновлений и включите в этот DataContext только необходимые столбцы.
Таким образом, ненужные столбцы даже не будут загружены и, конечно же, не будут отправлены обратно в базу данных.
не могли бы вы привести пример того, как именно вы это сделали, пожалуйста, спасибо
Я дам вам положительный голос, если вы любезно дадите нам пример.
это будет работать нормально ExecuteCommand ("UPDATE tIdx_TicketActivity SET Archive = {0} WHERE ExpiryTimeStamp
Это загрузка статьи, которая является медленной и ненужной - конечно, обновление тоже, но сейчас меня больше всего беспокоило его загрузка.