Если имеется несколько таблиц и данных, принадлежащих пользователю, немного, вы можете выполнить команды в LINQ to SQL. Под «не очень» я подразумеваю несколько записей, которые практически не меняются, таких как информация для входа в систему, адрес и информация В идеале вы хотели бы сохранить всю эту логику вместе, чтобы гарантировать, что шаги всегда выполняются в намеченном порядке. Даже если это так, хранимая процедура все еще может использоваться.
С другой стороны, если ожидается, что данных будет много, например, пользователь форума, у которого есть несколько постов, комментариев, избранных, закладок и т. Д., Тогда я рекомендую использовать хранимую процедуру, которая принимает идентификатор пользователя и остальное по мере необходимости. Проблема заключается в том, что для каждой соответствующей записи выдается один оператор удаления . Именно это приводит к более низкой производительности, чем оператор delete, который удаляет все записи, связанные с идентификатором пользователя, в одном операторе.
Вариант № 1: использовать хранимую процедуру
Вы можете отобразить хранимую процедуру в свой DataContext, что дает вам возможность использовать ее как dc.DeleteUserAccount(userId)
. У Скотта Гу есть отличное сообщение в блоге, которое поможет вам начать: LINQ to SQL (Часть 6 - Получение данных с использованием хранимых процедур) .
Вариант № 2: используйте код пакетного обновления Терри Ани
У Терри Ани есть отличное сообщение в блоге, в котором рассказывается о его опыте разработки возможности пакетного обновления и удаления с помощью LINQ to SQL. Вместо генерации одного оператора обновления / удаления для каждой совпадающей записи, код будет генерировать один оператор для всех записей так, как мы обычно пишем их. Почту и код можно найти здесь: Пакетное обновление и удаление с LINQ to SQL .
Вариант № 3: Использовать метод DataContext.ExecuteCommand
Метод DataContext.ExecuteCommand может использоваться для непосредственного выполнения SQL, например:
int affectedRecords =
dc.ExecuteCommand("Update Person SET FirstName = {0} WHERE FirstName = {1}", "Foo", "Bar");
Обратите внимание на использование {0}
и {1}
, которые позволяют параметризовать ввод. Используйте это вместо объединения, чтобы предотвратить атаки SQL-инъекций.
Если вы собираетесь использовать это, то вы могли бы также пойти с опцией # 1.