删除具有已连接表的重复记录并修复相关表上的外键

时间:2014-10-09 20:06:57

标签: c# sql sql-server linq entity-framework

我们有这些表:
用户
地址 - >用户有地址_Id
帖子 - >帖子有user_id

问题是Users表有许多重复记录完全相同,所有字段都相同,并且在某些情况下地址是相同的,所以我们加入了Users和Addresses表来比较每个字段
然后使用其中一个重复行更新posts表中的外键 然后从用户中删除所有重复项 我们使用了一个sql解决方案,类似于http://weblogs.sqlteam.com/jeffs/archive/2004/10/07/2190.aspx,但是更长一些。

我的问题是如何使用linq和实体框架工作完成相同的任务? 在sql中搜索这个问题的时候,我发现很多人在谈论它,但是找不到关于使用linq或实体框架来做这件事的事情,所以如果有人在此之前遇到这个或者有一个起点,这将是很好的。

1 个答案:

答案 0 :(得分: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为密钥的列表。

如果UserID包含该外键,则可以检查ListUsers中的每个Posts,如果是,则将其替换为ListUsersItem.FirstUserID

要从用户中移除所有重复项,请对Users执行相同操作,如果它与UserIDs匹配且不是FirstUserID,请将其删除。或者您可以使用Distinct()方法使用另一种方法作为Comparer来比较所有属性,然后再区分它们。