with update net mvc framework editar detalle con asp actualizar c# linq performance linq-to-sql

c# - update - ¿Cómo actualizar una sola columna en LINQ sin cargar toda la fila?



update linq asp net mvc (3)

En LinqToSql, es muy fácil cargar una fila, cambiar una columna y enviar los cambios a la base de datos:

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

El único inconveniente: el artículo es enorme. Para cargar todo el artículo, solo actualizar una columna es excesivo y ralentiza significativamente mi aplicación.

¿Hay alguna forma de actualizar una sola columna usando LINQ, sin tener que cargar toda la fila?

Ahora vuelvo a usar ExecuteCommand donde la velocidad es esencial, pero esto es feo y propenso a errores:

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


Debe establecer UpdateCheck en todas las propiedades de la clase Article excepto la clave principal (haga clic en la propiedad class en el diseñador LINQ2SQL y cambie a la ventana Propiedades de la herramienta) en Never (no estoy seguro acerca de WhenChanged, tal vez eso también funcione, adelante y experimente ¡eso!).

Esto obligará a LINQ2SQL a usar

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

en lugar de la versión larga con todas las columnas en la cláusula WHERE:

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

Ahora puedes usar código como

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

Básicamente indica que solo la propiedad ItemsInStock ha cambiado; otros accesorios deberían tener el mismo valor predeterminado, por supuesto, articleID es el mismo.

NOTA: no necesita buscar el artículo antes de eso.


Ligget78 me dio otra idea de cómo hacer una actualización de una sola columna:

Cree un nuevo DataContext solo para este tipo de actualización, y solo incluya las columnas necesarias en este DataContext.

De esta forma, las columnas innecesarias ni siquiera se cargarán y, por supuesto, no se enviarán a la base de datos.


funcionará bien ExecuteCommand ("UPDATE tIdx_TicketActivity SET Archive = {0} WHERE ExpiryTimeStamp