如果有少量表并且属于用户的数据不多,那么您可以在 LINQ to SQL 中发出命令。我所说的“不多”是指一些几乎没有变化的记录,例如登录信息、地址信息和偏好。理想情况下,您希望将所有这些逻辑放在一起,以确保这些步骤始终按预期顺序执行。即使是这种情况,仍然可以使用存储过程。
另一方面,如果预计数据会很多,例如拥有多个帖子、评论、收藏夹、书签等的论坛用户,那么我建议使用一个存储过程,该过程获取用户 ID 并将其余部分作为需要。问题是每个匹配的记录都会发出一个删除语句。这就是导致性能比在一个语句中删除与用户 ID 关联的所有记录的删除语句更差的原因。
选项 #1:使用存储过程
您可以将存储过程映射到您的 DataContext,这使您能够将其用作dc.DeleteUserAccount(userId)
. Scott Gu 有一篇出色的博客文章可以帮助您入门:LINQ to SQL(第 6 部分 - 使用存储过程检索数据)。
选项 #2:使用 Terry Aney 的批量更新代码
Terry Aney 有一篇很棒的博客文章,讨论了他开发使用 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。