从多个表中删除(linq到sql)

时间:2010-03-03 01:42:12

标签: performance sql-server-2005 linq-to-sql delete-row

我正在使用Linq to SQL来访问我的数据库。我希望有一个“删除帐户”功能,它基本上摆脱了属于给定用户的所有表中的所有记录。这样做最有效的方法是什么?

删除必须按特定顺序进行,否则会出现外键完整性错误。我可以从数据库中手动执行此操作,我的猜测是在L2S中简单地模拟它,例如(伪代码)

var tb1del = From Table1 Where userId == userIdToDelete;
mydatacontext.Table1.deleteonsubmit(tb1del);

var tb1de2 = From Table1 Where userId == userIdToDelete;
mydatacontext.Table2.deleteonsubmit(tb1de2);
...

但是,我确信这不是删除记录的最有效方法。

3 个答案:

答案 0 :(得分:6)

最简单的解决方案是在数据库中使用FOREIGN KEY创建ON DELETE CASCADE约束。这样您就不必担心删除顺序或其他任何问题。只需删除帐户记录即可。

答案 1 :(得分:2)

如果有少量表并且属于该用户的数据不多,那么您可以在LINQ to SQL中发出命令。 “不是很多”我指的是一些几乎没有变化的记录,例如登录信息,地址信息和偏好。理想情况下,您希望将所有这些逻辑保持在一起,以确保步骤始终按预期顺序执行。即使是这种情况,仍然可以使用存储过程。

另一方面,如果数据预计会很多,例如论坛用户有多个帖子,评论,收藏夹,书签等,那么我建议使用一个带有用户ID的存储过程。其余的根据需要。关注的是为每个匹配记录发出一个删除语句。这就是导致性能较差的原因,而删除语句删除了一个语句中与用户ID关联的所有记录。

选项#1:使用存储过程

您可以将存储过程映射到DataContext,这样您就可以将其用作dc.DeleteUserAccount(userId)。 Scott Gu有一篇很棒的博客文章可以帮助你入门:LINQ to SQL (Part 6 - Retrieving Data Using Stored Procedures)

选项#2:使用Terry Aney的批量更新代码

Terry Aney有一篇很棒的博客文章,讨论了他以高效的方式开发使用LINQ to SQL批量更新和删除的能力。代码不会为每个匹配记录生成单个更新/删除语句,而是为我们通常编写它们的方式生成所有记录的单个语句。帖子和代码可以在这里找到:Batch Updates and Deletes with LINQ to SQL

选项#3:使用DataContext.ExecuteCommand方法

DataContext.ExecuteCommand method可用于直接执行SQL,例如:

int affectedRecords = 
    dc.ExecuteCommand("Update Person SET FirstName = {0} WHERE FirstName = {1}", "Foo", "Bar");

请注意使用允许输入参数化的{0}{1}。使用它而不是连接来防止SQL注入攻击。

如果您打算使用它,那么您也可以使用选项#1。

答案 2 :(得分:2)

Aaronaught是正确的,但对于那些想知道如何在Microsoft SQL Server Management Studio中执行此操作的人,我附上了一个屏幕截图,其中描述了在何处。

右键单击所需的表格,点击Relationships按钮,点击其中一个关系,然后展开INSERT And UPDATE Spesification下的Table designer

然后选择Delete rule = Cascade,您就完成了。每次从此表中删除记录时,您选择级联的所有外键项也将被删除。

alt text