【发布时间】:2013-04-03 23:24:05
【问题描述】:
我有一个半百万的记录表,我需要找到重复项。所以我使用我创建的这段代码:
var dups2 = from m in mg_B
group m by new { m.Addr1, m.Addr2, m.City, m.State }
into g
where g.Count() > 1
select g;
此代码的问题在于,它不会将 addr1 为空字符串“”和分别为 NULL 的 2 条记录作为重复记录。
基本上在比较字段的空值和空值时,它会将它们视为不同,但我需要被视为相同。
我知道我可以检查每条记录并将空值替换为“”,但我花了 1 分钟时间检查了 4 000 条记录。当有人单击按钮时,这将重复执行。
我发现了这个空字符串问题,因为我最初创建了一个只包含一些字段的类(该表有 40 多个字段)。
List<CombineClass> mg = (from m in db.MG_Backup
where m.IsArchived == false
select new CombineClass { id = m.ID, name = m.Name, addr1 = string.IsNullOrEmpty(m.Addr1) ? "" : m.Addr1, addr2 = string.IsNullOrEmpty(m.Addr2) ? "" : m.Addr2, city = m.City, state = m.State }).ToList();
有什么想法吗?
【问题讨论】:
-
第二个例子发生了什么?你是说一个工作但不受欢迎,因为你必须检查和行动?一个空字符串和 null 是非常不同的东西,如果这就是你要问的,你不能告诉语言以其他方式对待它们。
-
在第一个示例中找到 6000 条记录,在第二个示例中找到超过 7000 条记录
-
你可以通过实现IEqualityComparer来实现你自己的comparer。然后,您的比较器将按照 您 的要求执行比较,方法是将 null 和空字符串视为相同。我怀疑它会很快 - 它仍然必须从数据库中提取所有记录并在 C# 端处理它们。您最好的选择是将数据库修复为只有
NULL用于您没有 AddrLine1 的记录(因为这在语义上是正确的)。 -
@Nathan 第一个示例和第二个示例不会返回相同的记录数,因为第一个示例中的
where g.Count > 1条件。如果删除该过滤器,请查看是否得到相同的计数。
标签: c# linq null duplicates