【问题标题】:Determine Duplicate data using LINQ to EF使用 LINQ to EF 确定重复数据
【发布时间】:2015-10-27 01:29:22
【问题描述】:

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

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

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

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

所以基本返回

| Number | Count |
   1234      2

任何使用 LINQ to EF 的帮助都将不胜感激,谢谢。

【问题讨论】:

  • 所以您想按号码和联系人 ID 的串联进行分组?

标签: c# linq entity-framework-4


【解决方案1】:

更新:

感谢@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.

【讨论】:

  • 我认为你忽略了ContactID is not the same 的部分,但只有Number 是;所以按两者分组不是解决方案。
  • @DrCopyPaste - 由于该声明,我们同时按 NumberContactId 进行分组,因此如果 ContactID 不相同,它将产生重复。跨度>
  • @DrCopyPaste - 添加了一个小提琴供参考。
  • 请求的结果是Number: 1234; Count: 2,好吧计数是微不足道的,但你返回Number: 9873, ContactId: 6
  • 很高兴我们清除了它;)啊,有一件事,你应该删除第一段和最后一个小提琴,这可能会让一些人感到困惑。
【解决方案2】:

这个查询避免了自定义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。然后它选择一个包含数字和第二个GroupBy 的新类型,该类型按ContactId 分组,然后只计算一个条目的所有组。然后它取所有计数大于零的结果。

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

【讨论】:

    【解决方案3】:

    另一种方法(使用 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多