【问题标题】: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 或实体框架做的事情,所以如果有人之前遇到过这个问题或者有一个起点,那就太好了。

【问题讨论】:

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


    【解决方案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() 方法和使用另一种方法作为比较器来比较所有属性,然后再区分它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-30
      • 2018-07-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多