使用LINQ to EF确定重复数据

本文关键字:数据 LINQ to EF 使用 | 更新日期: 2023-09-27 18:19:27

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

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

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

现在,我想选择一个以上出现Number的数据,但前提是ContactID不相同。

所以基本上返回

| Number | Count |
   1234      2

如有任何帮助,请使用LINQ to EF,谢谢。

使用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
                     };

样品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。然后,它选择一个包含数字的新类型和第二个按ContactId分组的GroupBy,然后用一个条目对所有组进行计数。然后它取所有计数大于零的结果。

没有针对EF测试它,但查询只使用标准的Linq运算符,所以EF在翻译它时应该不会有任何问题。

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

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