C# 使用LINQ到EF确定重复数据

C# 使用LINQ到EF确定重复数据,c#,linq,entity-framework-4,C#,Linq,Entity Framework 4,我有一个数据集,我想通过分组来确定重复数据 例如,我有一个如下所示的数据集 |id | Number | ContactID 1 1234 5 2 9873 6 3 1234 7 4 9873 6 现在我想选择的数据有一个以上的号码出现,但只有当ContactID是不一样的 所以基本上是返回 | Number | Count | 1234 2 如果您

我有一个数据集,我想通过分组来确定重复数据

例如,我有一个如下所示的数据集

|id  |  Number  | ContactID  
 1      1234        5       
 2      9873        6
 3      1234        7
 4      9873        6
现在我想选择的数据有一个以上的号码出现,但只有当ContactID是不一样的

所以基本上是返回

| Number | Count |
   1234      2

如果您使用LINQ对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
                     };

此查询避免了使自定义的
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();

它执行一个初始的
GroupBy
,以获取所有重复的
数字。然后,它选择一个包含号码的新类型和第二个按联系人ID分组的
GroupBy
,然后用一个条目对所有组进行计数。然后它获取计数大于零的所有结果

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

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


那么你想通过号码和联系人ID的串联进行分组吗?我想你忽略了其中的一部分,它说,
ContactID不相同,但只有
Number
是;因此,按两者分组不是解决方案。@DrCopyPaste-由于该语句,我们按两者分组,即
编号
&
联系人ID
,因此如果联系人ID不相同,它将产生重复项。@DrCopyPaste-添加了一个提琴以供参考。请求的结果是
编号:1234;计数:2
,好的,计数很小,但您返回的是
号码:9873,联系人ID:6
很高兴我们解决了这个问题;)啊,有一件事,你们应该删除第一段和最后一段,这可能会混淆一些ppl。
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();