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