Comment mettre à jour une seule colonne dans LINQ sans charger toute la ligne?

Dans LinqToSql, il est très facile de charger une ligne, de modifier une colonne et de soumettre les modifications à la firebase database:

using (MyDataContext wdc = new MyDataContext()) { Article article = wdc.Article.First(p => p.ID == id); article.ItemsInStock = itemsinstock; wdc.SubmitChanges(); } 

Le seul inconvénient: l’article est énorme. Pour charger l’intégralité de l’article, le simple fait de mettre à jour une colonne est excessif et ralentit considérablement mon application.

Existe-t-il un moyen de mettre à jour une seule colonne à l’aide de LINQ sans avoir à charger la ligne entière?

En ce moment, je reviens à utiliser ExecuteCommand où la vitesse est essentielle, mais c’est moche et sujet aux erreurs:

 wdc.ExecuteCommand("UPDATE Article SET ItemsInStock = @1 WHERE ID = @2", itemsinstock,id); 

Vous devez définir UpdateCheck sur toutes les propriétés de la classe Article, à l’exception de la clé primaire (cliquez sur la propriété de la classe dans le concepteur LINQ2SQL et basculez vers la fenêtre de l’outil Propriétés) sur Jamais (vous n’êtes pas sûr de l’option WhenChanged, cela fonctionne peut-être aussi – poursuivez et expérimentez il!).

Cela forcera LINQ2SQL à utiliser

 UPDATE ... SET ... WHERE ID = @2 

au lieu de la version longue avec toutes les colonnes de la clause WHERE:

  UPDATE ... SET ... WHERE ID = @2 AND ItemsInStock = @1 AND SomeOtherColumn = @3 AND... 

Maintenant, vous pouvez utiliser un code comme

 context.Articles.Attach(article /* article with updated values */, new Article { ID = articleID, ItemsInStock = -1 } /* pretend that this is the original article */); context.SubmitChanges(); 

En gros, vous indiquez que seule la propriété ItemsInStock a été modifiée – les autres accessoires doivent avoir la même valeur par défaut, articleID étant bien entendu le même.

REMARQUE: vous n’avez pas besoin d’aller chercher l’article avant cela.

ligget78 m’a donné une autre idée sur la façon de mettre à jour une seule colonne:

Créez un nouveau DataContext uniquement pour ce type de mise à jour et incluez uniquement les colonnes nécessaires dans ce DataContext.

De cette façon, les colonnes inutiles ne seront même pas chargées et, bien sûr, ne seront pas renvoyées à la firebase database.

cela fonctionnera bien ExecuteCommand (“UPDATE tIdx_TicketActivity SET Archive = = 0