Si hay un puñado de tablas y los datos que pertenecen al usuario no son mucho, entonces podría emitir los comandos en LINQ to SQL. Por "no es mucho" me refiero a algunos registros que apenas cambian, como información de inicio de sesión, información de dirección y preferencias. Lo ideal sería mantener toda esta lógica unida para garantizar que los pasos se ejecuten siempre en el orden deseado. Incluso si este es el caso, aún se puede usar un procedimiento almacenado.
Por otro lado, si se espera que los datos sean muchos, como un usuario de foro que tenga varias publicaciones, comentarios, favoritos, marcadores, etc., le recomiendo usar un procedimiento almacenado que tome la ID del usuario y hace el resto según sea necesario. La preocupación es que se emite una única declaración de eliminación para cada registro coincidente. Eso es lo que causa un peor rendimiento que una declaración de eliminación que borra todos los registros asociados con la identificación del usuario en una declaración.
Opción # 1: Utilice un procedimiento almacenado
Puede asignar el procedimiento almacenado para su DataContext, lo que le da la posibilidad de utilizarlo como dc.DeleteUserAccount(userId)
. Scott Gu tiene una excelente publicación de blog que puede ayudarlo a comenzar: LINQ to SQL (Part 6 - Retrieving Data Using Stored Procedures).
Opción # 2: Uso de lotes de Terry Aney código de actualización de
Terry Aney tiene una gran entrada de blog que habla de su experiencia en el desarrollo de la capacidad de actualización por lotes y borrar con LINQ to SQL de una manera eficiente. En lugar de generar una sola declaración de actualización/eliminación para cada registro coincidente, el código generará una sola declaración para todos los registros de la forma en que normalmente los escribiríamos. La publicación y el código se pueden encontrar aquí: Batch Updates and Deletes with LINQ to SQL.
Opción # 3: Utilice el método DataContext.ExecuteCommand
El DataContext.ExecuteCommand method se puede utilizar para ejecutar SQL directamente, tales como:
int affectedRecords =
dc.ExecuteCommand("Update Person SET FirstName = {0} WHERE FirstName = {1}", "Foo", "Bar");
Aviso el uso de {0}
y {1}
que permiten la entrada para ser parametrizado. Use esto en lugar de concatenar para evitar ataques de inyección SQL.
Si vas a utilizar esto, entonces también puedes ir con la opción n. ° 1.
Si pudiera hacer una pregunta. ¿Por qué hacer esto desde linq-a-sql en lugar de con un SP o algo similar en el db mismo? De esta forma puede controlar el pedido, proporcionar otras funcionalidades, etc. Parece engorroso hacerlo con l2s en lugar de utilizar la funcionalidad incorporada del db. – GrayWizardx
Nunca he usado SQL directamente, así que pensé que sería más fácil de Linq. Sin embargo, no me importa usar SQL con algunas sugerencias :) –