使用 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
};
此查询避免了自定义 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
以获得所有重复的 Numbers
。然后它选择一个包含数字的新类型和第二个 GroupBy
按 ContactId
分组的类型然后计算所有组只有一个条目。然后它获取计数大于零的所有结果。
尚未针对 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();
我有一个数据集,我想对其进行分组以确定重复数据。
示例我有一个看起来像这样的数据集。
|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
};
此查询避免了自定义 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
以获得所有重复的 Numbers
。然后它选择一个包含数字的新类型和第二个 GroupBy
按 ContactId
分组的类型然后计算所有组只有一个条目。然后它获取计数大于零的所有结果。
尚未针对 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();