我们有这些表:
用户
地址 - >用户有地址_Id
帖子 - >帖子有user_id
问题是Users表有许多重复记录完全相同,所有字段都相同,并且在某些情况下地址是相同的,所以我们加入了Users和Addresses表来比较每个字段
然后使用其中一个重复行更新posts表中的外键
然后从用户中删除所有重复项
我们使用了一个sql解决方案,类似于http://weblogs.sqlteam.com/jeffs/archive/2004/10/07/2190.aspx,但是更长一些。
我的问题是如何使用linq和实体框架工作完成相同的任务? 在sql中搜索这个问题的时候,我发现很多人在谈论它,但是找不到关于使用linq或实体框架来做这件事的事情,所以如果有人在此之前遇到这个或者有一个起点,这将是很好的。
答案 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来比较所有属性,然后再区分它们。