使用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,谢谢。
更新:
感谢@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