使用LINQ查找重复记录并在多列上进行匹配?

时间:2015-10-20 14:51:14

标签: vb.net linq

我正在尝试编写查询以查找用户的所有潜在重复记录。副本定义为以下任何一种:

  • (姓氏或名字)+(电子邮件或电话)匹配
  • 记录ExternalID必须为null +记录B ExternalID不能为空

我有来自两个独立系统的数据,从系统B我的表上的externalID将填充GUID,从系统A,externalID将为null。我只关心在两个系统之间找到重复,而不是在每个系统中重复。

我到目前为止的查询:

 Dim duplicates = db.People.Where(Function(c) c.CID = CID And c.DeleteFlag = False). _
        Where(Function(p) p.EmailAddress <> Nothing And p.ExternalID <> Nothing) _
       .GroupBy(Function(i) New With {i.EmailAddress, i.LastName, i.FirstName}) _
       .Where(Function(g) g.Count() > 1).[Select](Function(g) g.Key)

我遇到的问题:

  • ExternalID匹配逻辑不起作用
  • 仅匹配emailaddress,lastname和firstname完全匹配的记录
  • 在群组中使用匿名类型,我无法提取记录唯一ID。如果我将PK添加到分组中,我将不会得到任何结果。

1 个答案:

答案 0 :(得分:2)

绝不使用<>=Nothing进行比较,您将始终获得False(类似于sql)。 Nothing不等于或等于其他任何东西。而是使用IsNotIs Nothing。也可以使用AndAlso代替And(和OrElse代替Or)。

在VB.NET中(而不是C#),您还必须指定用于匿名类型的EqualsGetHashCode的键列。

Dim duplicates = db.People.Where(Function(c) c.CID = CID And c.DeleteFlag = False). 
       Where(Function(p) p.EmailAddress IsNot Nothing AndAlso p.ExternalID IsNot Nothing).
       GroupBy(Function(i) New With {Key i.EmailAddress, Key i.LastName, Key i.FirstName}).
       Where(Function(g) g.Count() > 1).
       Select(Function(g) g.Key)