Как обновить один столбец в LINQ, не загружая всю строку? - PullRequest
7 голосов
/ 21 октября 2008

В 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);

Ответы [ 3 ]

9 голосов
/ 21 октября 2008

Вам необходимо установить UpdateCheck для всех свойств класса Article, кроме первичного ключа (щелкните свойство класса в конструкторе LINQ2SQL и переключитесь в окно «Свойства инструмента») в значение «Никогда» (не уверен насчет 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.

ПРИМЕЧАНИЕ: вам не нужно загружать статью до этого.

0 голосов
/ 22 июля 2011

это будет нормально работать ExecuteCommand ("UPDATE tIdx_TicketActivity SET Archive = {0} ГДЕ ExpiryTimeStamp

0 голосов
/ 01 февраля 2010

ligget78 дал мне еще одну идею, как сделать обновление одного столбца:

Создайте новый DataContext только для этого вида обновления и включите в него только необходимые столбцы.

Таким образом, ненужные столбцы даже не будут загружены и, конечно, не отправлены обратно в базу данных.

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