Vb.net 在多个列上查找与LINQ匹配的重复记录?
我正在尝试编写一个查询,以查找用户的所有潜在重复记录。副本定义为以下任一项:Vb.net 在多个列上查找与LINQ匹配的重复记录?,vb.net,linq,Vb.net,Linq,我正在尝试编写一个查询,以查找用户的所有潜在重复记录。副本定义为以下任一项: (姓或名)+(电子邮件或电话)匹配 记录A外部ID必须为null+记录B外部ID不得为null 我的数据来自两个独立的系统,从系统B到表上的externalID将填充GUID,从系统a到externalID将为null。我只关心寻找两个系统之间的重复项,而不是每个系统内的重复项 到目前为止,我提出的问题是: Dim duplicates = db.People.Where(Function(c) c.CID =
- (姓或名)+(电子邮件或电话)匹配
- 记录A外部ID必须为null+记录B外部ID不得为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)
Dim duplicates=db.People.Where(函数(c)c.CID=CID和c.DeleteFlag=False)_
其中(函数(p)p.EmailAddress Nothing和p.ExternalID Nothing)_
.GroupBy(函数(i)带有{i.EmailAddress,i.LastName,i.FirstName}的新函数)_
.其中(函数(g)g.Count()>1)。[选择](函数(g)g.Key)
我遇到的问题:
- 外部ID匹配逻辑不起作用
- 仅匹配emailaddress、lastname和firstname完全匹配的记录
- 使用组中的匿名类型,我无法提取记录的唯一ID。如果我将PK添加到组中,我将不会得到任何结果李>
或=
进行比较,您总是会得到False
(与sql中类似)<代码>无任何内容不等于或不等于任何其他内容。而是使用IsNot
或isnothing
。也可以使用而不是和
(和OrElse
而不是或
)
在VB.NET中(与C#相反),还必须指定用于匿名类型的Equals
和GetHashCode
的键列
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)
看看我在上面关于
GroupBy
查询的评论(我昨天确认你的版本不起作用)。无论如何,我的建议都是Key.randomName=I.EmailAddress
这里不需要什么,所以我最好删除上面的评论。尽管在对数据表的列执行此操作时需要使用此部分(.randomName=
部分),以避免出现错误“只能推断匿名类型成员名…”(C#和VB.NET中都会发生这种情况)。@TimSchmelter感谢您的反馈。ExternalID仍然存在问题,因为此查询排除了任何外部ID为Nothing的记录。我正在尝试查找匹配项,其中1条记录有外部ID,而1条记录没有外部ID。如果两条记录都有外部ID,或者两条记录都没有外部ID,则这是无效的结果。我也不知道如何让一个查询执行所有匹配条件(现在有多个查询,然后连接它们)