删除连接表的重复记录并修复相关表上的外键
Posted
技术标签:
【中文标题】删除连接表的重复记录并修复相关表上的外键【英文标题】:Delete duplicate records with joined table and fix foreign keys on related table 【发布时间】:2014-10-09 20:06:56 【问题描述】:我们有这些桌子: 用户 地址 -> 用户拥有 address_Id 帖子 -> 帖子有 user_id
问题是 Users 表有许多重复的完全相同的记录,所有字段都相等,而且在某些情况下地址相同,因此我们加入了 Users 和 Addresses 表来比较每个字段 然后用其中一个重复行更新帖子表中的外键。 然后从用户中删除所有重复项。 我们使用了一个 sql 解决方案,类似于 http://weblogs.sqlteam.com/jeffs/archive/2004/10/07/2190.aspx 但要长一点。
我的问题是如何使用 linq 和实体框架工作来完成相同的任务? 在 sql 中搜索这个问题时,我发现很多人在谈论它,但找不到关于使用 linq 或实体框架做的事情,所以如果有人之前遇到过这个问题或者有一个起点,那就太好了。
【问题讨论】:
【参考方案1】:var ListUsers = from user in context.Users
join address in context.Addresses
select new
User = user,
Address = address
into users
group users by new
user.Property1OtherthanID,
user.Property2OtherthanID,
...
address.Property1OtherthanID,
address.Property2OtherthanID,
...
into distinct
select new
FirstUserID = distinct.FirstOrDefault().User.ID,
UserIDs = distinct.Select(u => u.User.ID)
这将为您提供所有 UserIDs
的列表,其中包含相同的记录和地址,FirstUserID
作为 Key。
如果Posts
包含该外键,则可以检查ListUsers
中的每个UserID
,如果是,则将其替换为ListUsersItem.FirstUserID
。
要从用户中删除所有重复项,请对 Users
执行相同操作,如果它与 UserIDs
匹配并且不是 FirstUserID
则删除它。或者您可以使用Distinct()
方法和使用另一种方法作为比较器来比较所有属性,然后再区分它们。
【讨论】:
以上是关于删除连接表的重复记录并修复相关表上的外键的主要内容,如果未能解决你的问题,请参考以下文章
删除左表上的重复项,同时在右表SELECT JOIN上保留重复项