使用 LINQ to EF 确定重复数据

Determine Duplicate data using LINQ to EF

我有一个数据集,我想对其进行分组以确定重复数据。

示例我有一个看起来像这样的数据集。

|id  |  Number  | ContactID  
 1      1234        5       
 2      9873        6
 3      1234        7
 4      9873        6

现在我想要 select 出现多次 Number 的数据,但前提是 ContactID 不同。

所以基本上return

| Number | Count |
   1234      2

如能使用 LINQ to EF 提供帮助,我们将不胜感激。

更新:

感谢@DrCopyPaste,他告诉我我误解了你的问题。这是正确的解决方案:-

  var result = from c in db.list
               group c by c.Number into g
               let count = g.GroupBy(x => x.ContactID).Where(x => x.Count() == 1).Count()
               where count != 0
               select new
                     {
                         Number = g.Key,
                         Count = count
                     };

Sample Fiddle.

此查询避免了自定义 IEqualityComparer 就好像我没记错似的,不认为它们与 EF 配合得很好。

var results = data.GroupBy(number => number.Number)
                  .Where(number => number.Count() > 1)
                  .Select(number => new
                  {
                      Number = number.Key,
                      Count = number.GroupBy(contactId => contactId.ContactId).Count(x => x.Count() == 1)
                  })
                  .Where(x => x.Count > 0).ToList();

Fiddle

它执行初始 GroupBy 以获得所有重复的 Numbers。然后它选择一个包含数字的新类型和第二个 GroupByContactId 分组的类型然后计算所有组只有一个条目。然后它获取计数大于零的所有结果。

尚未针对 EF 对其进行测试,但该查询仅使用标准 Linq 运算符,因此 EF 在转换它时应该没有任何问题。

另一种方法(使用一级分组):

var results = data
              .Where(x => data.Any(y => y.Id != x.Id && y.Number == x.Number && y.ContactId != x.ContactId))
              .GroupBy(x => x.Number)
              .Select(grp => new { Number = grp.Key, Count = grp.Count() })
              .ToList();

Fiddle